Files
All-MQL5-code/Experts/Articles/481/ctrade_sample_ea.mq5
T
2018-03-14 11:26:36 +01:00

394 lines
18 KiB
Plaintext

//+------------------------------------------------------------------+
//| CTrade_Sample_EA.mq5 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#include<Trade\Trade.mqh>
#property description "This Expert Advisor shows some examples of working "
#property description "with CTrade class. Its functions are not called."
//--- object for performing trade operations
CTrade trade;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set MagicNumber for your orders identification
int MagicNumber=123456;
trade.SetExpertMagicNumber(MagicNumber);
//--- set available slippage in points when buying/selling
int deviation=10;
trade.SetDeviationInPoints(deviation);
//--- order execution mode
trade.SetTypeFilling(ORDER_FILLING_RETURN);
//--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own
trade.LogLevel(1);
//--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()
trade.SetAsyncMode(true);
//---
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//--- Buy sample
//+------------------------------------------------------------------+
//| Buying a specified volume at the current symbol |
//+------------------------------------------------------------------+
void BuySample1()
{
//--- 1. example of buying at the current symbol
if(!trade.Buy(0.1))
{
//--- failure message
Print("Buy() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Buying with specified volume and symbol |
//+------------------------------------------------------------------+
void BuySample2()
{
//--- 2. example of buying at the specified symbol
if(!trade.Buy(0.1,"GBPUSD"))
{
//--- failure message
Print("Buy() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Buying with specifying all order parameters |
//+------------------------------------------------------------------+
void BuySample3()
{
//--- 3. example of buying at the specified symbol with specified SL and TP
double volume=0.1; // specify a trade operation volume
string symbol="GBPUSD"; //specify the symbol, for which the operation is performed
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point
double bid=SymbolInfoDouble(symbol,SYMBOL_BID); // current price for closing LONG
double SL=bid-1000*point; // unnormalized SL value
SL=NormalizeDouble(SL,digits); // normalizing Stop Loss
double TP=bid+1000*point; // unnormalized TP value
TP=NormalizeDouble(TP,digits); // normalizing Take Profit
//--- receive the current open price for LONG positions
double open_price=SymbolInfoDouble(symbol,SYMBOL_ASK);
string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
symbol,volume,
DoubleToString(open_price,digits),
DoubleToString(SL,digits),
DoubleToString(TP,digits));
if(!trade.Buy(volume,symbol,open_price,SL,TP,comment))
{
//--- failure message
Print("Buy() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("Buy() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//--- Examples for placing a limit order
//+------------------------------------------------------------------+
//| Placing a limit order at the current symbol |
//+------------------------------------------------------------------+
void BuyLimit_Sample1()
{
//--- 1. example of placing a Buy Limit pending order
string symbol="GBPUSD"; // specify the symbol, at which the order is placed
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point
double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price
double price=1000*point; // unnormalized open price
price=NormalizeDouble(price,digits); // normalizing open price
//--- everything is ready, sending a Buy Limit pending order to the server
if(!trade.BuyLimit(0.1,price))
{
//--- failure message
Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Placing a limit order specifying all the parameters |
//+------------------------------------------------------------------+
void BuyLimit_Sample2()
{
//--- 2. example of placing a Buy Limit pending order with all parameters
double volume=0.1;
string symbol="GBPUSD"; // specify the symbol, at which the order is placed
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point
double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price
double price=1000*point; // unnormalized open price
price=NormalizeDouble(price,digits); // normalizing open price
int SL_pips=300; // Stop Loss in points
int TP_pips=500; // Take Profit in points
double SL=price-SL_pips*point; // unnormalized SL value
SL=NormalizeDouble(SL,digits); // normalizing Stop Loss
double TP=price+TP_pips*point; // unnormalized TP value
TP=NormalizeDouble(TP,digits); // normalizing Take Profit
datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
string comment=StringFormat("Buy Limit %s %G lots at %s, SL=%s TP=%s",
symbol,volume,
DoubleToString(price,digits),
DoubleToString(SL,digits),
DoubleToString(TP,digits));
//--- everything is ready, sending a Buy Limit pending order to the server
if(!trade.BuyLimit(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment))
{
//--- failure message
Print("BuyLimit() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("BuyLimit() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//--- Examples for placing a stop order
//+------------------------------------------------------------------+
//| Placing a stop order at the current symbol |
//+------------------------------------------------------------------+
void BuyStop_Sample1()
{
//--- 1. example of placing a Buy Stop pending order
string symbol="USDJPY"; // specify the symbol, at which the order is placed
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point
double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price
double price=1000*point; // unnormalized open price
price=NormalizeDouble(price,digits); // normalizing open price
//--- everything is ready, sending a Buy Stop pending order to the server
if(!trade.BuyStop(0.1,price))
{
//--- failure message
Print("BuyStop() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Placing a stop order specifying all the parameters |
//+------------------------------------------------------------------+
void BuyStop_Sample2()
{
//--- 2. example of placing a Buy Stop pending order with all parameters
double volume=0.1;
string symbol="USDJPY"; // specify the symbol, at which the order is placed
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
double point=SymbolInfoDouble(symbol,SYMBOL_POINT); // point
double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // current buy price
double price=1000*point; // unnormalized open price
price=NormalizeDouble(price,digits); // normalizing open price
int SL_pips=300; // Stop Loss in points
int TP_pips=500; // Take Profit in points
double SL=price-SL_pips*point; // unnormalized SL value
SL=NormalizeDouble(SL,digits); // normalizing Stop Loss
double TP=price+TP_pips*point; // unnormalized TP value
TP=NormalizeDouble(TP,digits); // normalizing Take Profit
datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
string comment=StringFormat("Buy Stop %s %G lots at %s, SL=%s TP=%s",
symbol,volume,
DoubleToString(price,digits),
DoubleToString(SL,digits),
DoubleToString(TP,digits));
//--- everything is ready, sending a Buy Stop pending order to the server
if(!trade.BuyStop(volume,price,symbol,SL,TP,ORDER_TIME_GTC,expiration,comment))
{
//--- failure message
Print("BuyStop() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//--- Examples for working with positions
//+------------------------------------------------------------------+
//| Position opening |
//+------------------------------------------------------------------+
void Open()
{
//--- number of decimal places
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- point value
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- receiving a buy price
double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- calculate and normalize SL and TP levels
double SL=NormalizeDouble(price-1000*point,digits);
double TP=NormalizeDouble(price+1000*point,digits);
//--- filling comments
string comment="Buy "+_Symbol+" 0.1 at "+DoubleToString(price,digits);
//--- everything is ready, trying to open a buy position
if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,0.1,price,SL,TP,comment))
{
//--- failure message
Print("PositionOpen() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("PositionOpen() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Closing a position specifying only a symbol |
//+------------------------------------------------------------------+
void Close()
{
//--- closing a position at the current symbol
if(!trade.PositionClose(_Symbol))
{
//--- failure message
Print("PositionClose() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("PositionClose() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Modification for Long position of StopLoss and TakeProfit levels|
//+------------------------------------------------------------------+
void ModifyPosition()
{
//--- number of decimal places
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- point value
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- receiving the current Bid price
double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
//--- calculate and normalize SL and TP levels
double SL=NormalizeDouble(price-1000*point,digits);
double TP=NormalizeDouble(price+1000*point,digits);
//--- everything is ready, trying to modify the buy position
if(!trade.PositionModify(_Symbol,SL,TP))
{
//--- failure message
Print("Ìåòîä PositionModify() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//--- Examples for working with orders
//+------------------------------------------------------------------+
//| Deleting an order by its ticket |
//+------------------------------------------------------------------+
void DeleteOrder()
{
//--- this is a sample order ticket, it should be received
ulong ticket=1234556;
//--- everything is ready, trying to modify the buy position
if(!trade.OrderDelete(ticket))
{
//--- failure message
Print("OrderDelete() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("OrderDelete() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+
//| Modifying a pending order |
//+------------------------------------------------------------------+
void ModifyOrder()
{
//--- this is a sample order ticket, it should be received
ulong ticket=1234556;
//--- this is a sample symbol, it should be received
string symbol="EURUSD";
//--- number of decimal places
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- point value
double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
//--- receiving a buy price
double price=SymbolInfoDouble(symbol,SYMBOL_ASK);
//--- calculate and normalize SL and TP levels
//--- they should be calculated based on the order type
double SL=NormalizeDouble(price-1000*point,digits);
double TP=NormalizeDouble(price+1000*point,digits);
//--- setting one day as a lifetime
datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
//--- everything is ready, trying to modify the order
if(!trade.OrderModify(ticket,price,SL,TP,ORDER_TIME_GTC,expiration))
{
//--- failure message
Print("OrderModify() method failed. Return code=",trade.ResultRetcode(),
". Code description: ",trade.ResultRetcodeDescription());
}
else
{
Print("OrderModify() method executed successfully. Return code=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
//---
}
//+------------------------------------------------------------------+