Double_trading

Author: Copyright 2014, MetaQuotes Software Corp.
Orders Execution
It automatically opens orders when conditions are reached
0 Views
0 Downloads
0 Favorites
Double_trading
//+------------------------------------------------------------------+
//|                                               Double trading.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//--- input parameters
input string Commentation1= "";//Ïàðàìåòðû îðäåðà:
input double    Lot1=1;// Ëîòû äëÿ 1-ãî ñèìâîëà
input double    Lot2=1.3;// Ëîòû äëÿ 2-ãî ñèìâîëà
input double    StopLoss=5000;// Stop Loss
input double    TakeProfit=5000;// Take Profit
input double    Profit=20;// Òðåáóåìàÿ ïðèáûëü â âàëþòå äåïîçèòà
enum comm 
  {
   S,     // Òåêóùèé ãðàôèê (ñòàâüòå áîëåå âîëàòèëüíûé)
   };
input comm MoneyN1= S;// Ñèìâîë ¹ 1
input string Money2= "USDCHF";// Ñèìâîë ¹ 2
input string Money1_SELL_or_BUY="Auto";// Ñèìâîë ¹ 1: ïðîäàâàòü (SELL), ïîêóïàòü (BUY) èëè ðîáîò (Auto)?
input string Money2_SELL_or_BUY="Auto";// Ñèìâîë ¹ 2: ïðîäàâàòü (SELL), ïîêóïàòü (BUY) èëè ðîáîò (Auto)?
enum Tr 
  {
   AutoD = 0,     // Ïàðíûå
   AutoM = 1,     // Çåðêàëüíûå
   };
input Tr Auto= AutoM;// Êàêèå ó âàñ ñèìâîëû (äëÿ ðîáîòèçèðîâàííîé òîðãîâëè)
input int    Try=10;// Ñêîëüêî ðàç ïûòàòüñÿ îòêðûòü îðäåð
input string Commentation2= "";//Ðàáîòà ïî ðàñïèñàíèþ:
input bool   Monday=true;// Ïîíåäåëüíèê (True - ðàáîòàåò, False - îòêëþ÷åí)
input bool   Tuesday=true;// Âòîðíèê (True - ðàáîòàåò, False - îòêëþ÷åí)
input bool   Wednesday=true;// Ñðåäà (True - ðàáîòàåò, False - îòêëþ÷åí)
input bool   Thursday=true;// ×åòâåðã (True - ðàáîòàåò, False - îòêëþ÷åí)
input bool   Friday=false;// Ïÿòíèöà (True - ðàáîòàåò, False - îòêëþ÷åí)
input string Commentation3= "";//Ïàðàìåòðû èíäèêàòîðà Correlation:
input double Open_Value=-0.98;// Ïëàíêà êîððåëÿöèè äëÿ îòêðûòèÿ îðäåðîâ
input double Demis_Value=0.003;// Ïîãðåøíîñòü ïëàíêè (+/-)
input int Depth=50;// Ïåðèîä ïîäñ÷åòà
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_WEIGHTED;// Öåíà

int  iWeek=0,Monday1=0,Tuesday2=0,Wednesday3=0,Thursday4=0,Friday5=0;
int  i=0,Correlation1=0,Deals=0;
long  TimePosition1=0,TimePosition2=0;
bool AutoF=false ,start=true, CorrelationF=0, TrendUP=0, TrendDown=0, TrendUP2=0, TrendDown2=0;
double order1=0, order2=0,ticket1=0, ticket2=0,CorrelationBuffer[1],OrderProfit1=0,OrderProfit2=0,bid=0,ask=0,point=0;
string Money1_SELLorBUY="",Money2_SELLorBUY="",Money1=Symbol(),nTypeEntry="";
datetime starttime=0;

//-----OrderSend:
double MyOrderSend(
   string   symbol,               // ñèìâîë
   ENUM_ORDER_TYPE cmd,           // òîðãîâàÿ îïåðàöèÿ
   double   volume,               // êîëè÷åñòâî ëîòîâ
   double   price,                // öåíà
   int      slippage,             // ïðîñêàëüçûâàíèå
   double   stoploss,             // stop loss
   double   takeprofit,           // take profit
   string   comment=NULL,         // êîììåíòàðèé
   int      magic=0,              // èäåíòèôèêàòîð
   datetime expiration=0,         // ñðîê èñòå÷åíèÿ îðäåðà
   color    arrow_color=clrNONE  // öâåò
               )
  {
  //--- ãîòîâèì çàïðîñ
   MqlTradeRequest request={0};
   request.action=TRADE_ACTION_DEAL;         // óñòàíîâêà îòëîæåííîãî îðäåðà
   request.magic=magic;                         // ORDER_MAGIC
   request.symbol=symbol;                       // èíñòðóìåíò
   request.volume=volume;                       // îáúåì â ëîòàõ
   request.sl=stoploss;                         // Stop Loss
   request.tp=takeprofit;                       // Take Profit   
   request.type=cmd;                            // òèï  îðäåðà
   request.price=price;                         // öåíà äëÿ îòêðûòèÿ
   request.deviation=slippage;                  // ïðîñêàëüçûâàíèå
   request.comment=comment;                     // êîììåíòàðèé
   request.expiration=expiration;               // ñðîê èñòå÷åíèÿ îðäåðà
//--- îòïðàâèì òîðãîâûé ïðèêàç
   MqlTradeResult result={0};
   if (OrderSend(request,result))
   return(result.price);
   else
   return(0);
  }
//-----OrderSend


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
//----
Money1_SELLorBUY = Money1_SELL_or_BUY;
Money2_SELLorBUY = Money2_SELL_or_BUY;
StringTrimLeft(Money1_SELLorBUY);
StringTrimLeft(Money2_SELLorBUY);
StringTrimRight(Money1_SELLorBUY);
StringTrimRight(Money2_SELLorBUY);
CorrelationBuffer[0]=0;

if (Monday==true)
{Monday1=1;
iWeek=1;}
if (Tuesday==true)
{Tuesday2=2;
iWeek=2;}
if (Wednesday==true)
{Wednesday3=3;
iWeek=3;}
if (Thursday==true)
{Thursday4=4;
iWeek=4;}
if (Friday==true)
{Friday5=5;
iWeek=5;}

if (StringSubstr(Money1_SELLorBUY,0,1)=="a" || StringSubstr(Money1_SELLorBUY,0,1)=="A" || StringSubstr(Money2_SELLorBUY,0,1)=="a" || StringSubstr(Money2_SELLorBUY,0,1)=="A")
AutoF = true;
//----
   //return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
  //----Function,ext:
  //Server Time:
  datetime Time1=TimeGMT();
  MqlDateTime strTime;
  TimeToStruct(Time1,strTime);
  //---

//----Robot:
// Int indicator (CorrelationBuffer[0],etc):
Correlation1=iCustom(Money1,0,"Correlation",Money2,Depth,AppliedPrice);
CopyBuffer(
   Correlation1,     // handle èíäèêàòîðà
   0,                // íîìåð áóôåðà èíäèêàòîðà
   0,                // îòêóäà íà÷íåì 
   1,                // ñêîëüêî êîïèðóåì
   CorrelationBuffer // ìàññèâ, êóäà áóäóò ñêîïèðîâàíû äàííûå
   );   
// Int indicator (CorrelationBuffer[0],etc)

///Correlation signal(CorrelationF):
if ((ticket1==0 && order1!=0) || start == true)
{
if ((ticket2==0 && order2!=0) || start == true)
{

if (CorrelationBuffer[0]<=Open_Value+Demis_Value && CorrelationBuffer[0]>=Open_Value-Demis_Value)
   CorrelationF=true;
///Correlation signal

///TRand (for Auto trading)
if (AutoF)
{
TrendUP=0;
TrendDown=0;
TrendUP2=0;
TrendDown2=0;
   if (((strTime.hour >= 19 && strTime.min >= 00) && (strTime.hour <= 23 && strTime.min <= 59)) || ((strTime.hour >= 00 && strTime.min >= 00) && (strTime.hour <= 5 && strTime.min <= 59))) // 19:00 - 6:00 (Òèõîîêåàíñêàÿ ñåññèÿ AUD, NZD)
      {if (StringFind(Money1,"AUD")==0)
         TrendUP = true; 
      if (StringFind(Money1,"AUD")==3)
         TrendDown = true; 
      if (StringFind(Money1,"NZD")==0)
         TrendUP = true; 
      if (StringFind(Money1,"NZD")==3)
         TrendDown = true; 
      if (StringFind(Money2,"AUD")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"AUD")==3)
         TrendDown2 = true; 
      if (StringFind(Money2,"NZD")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"NZD")==3)
         TrendDown2 = true;} 
   if (((strTime.hour >= 6 && strTime.min >= 00) && (strTime.hour <= 8 && strTime.min <= 59))) // 6:00 - 9:00 (Àçèàòñêàÿ ñåññèÿ JPY)
      {if (StringFind(Money1,"JPY")==0)
         TrendUP = true; 
      if (StringFind(Money1,"JPY")==3)
         TrendDown = true;          
      if (StringFind(Money2,"JPY")==0)
         TrendUP2 = true;    
      if (StringFind(Money2,"JPY")==3)
         TrendDown2 = true;}         
   if ((strTime.hour >= 9 && strTime.min >= 00) && (strTime.hour <= 15 && strTime.min <= 59)) // 9:00 - 16:00 (Åâðîïåéñêàÿ ñåññèÿ EUR, CHF, GBP)
      {if (StringFind(Money1,"EUR")==0)
         TrendUP = true; 
      if (StringFind(Money1,"EUR")==3)
         TrendDown = true; 
      if (StringFind(Money1,"CHF")==0)
         TrendUP = true; 
      if (StringFind(Money1,"CHF")==3)
         TrendDown = true; 
      if (StringFind(Money1,"GBP")==0)
         TrendUP = true; 
      if (StringFind(Money1,"GBP")==3)
         TrendDown = true;           
      if (StringFind(Money2,"EUR")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"EUR")==3)
         TrendDown2 = true; 
      if (StringFind(Money2,"CHF")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"CHF")==3)
         TrendDown2 = true;            
      if (StringFind(Money2,"GBP")==0)
         TrendUP2 = true;    
      if (StringFind(Money2,"GBP")==3)
         TrendDown2 = true;}           
   if ((strTime.hour >= 16 && strTime.min >= 00) && (strTime.hour <= 21 && strTime.min <= 59)) // 16:00 - 22:00 (Àìåðèêàíñêàÿ ñåññèÿ USD, CAD)
      {if (StringFind(Money1,"USD")==0)
         TrendUP = true;
      if (StringFind(Money1,"USD")==3)
         TrendDown = true; 
      if (StringFind(Money1,"CAD")==0)
         TrendUP = true; 
      if (StringFind(Money1,"CAD")==3)
         TrendDown = true; 
      if (StringFind(Money2,"USD")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"USD")==3)
         TrendDown2 = true; 
      if (StringFind(Money2,"CAD")==0)
         TrendUP2 = true; 
      if (StringFind(Money2,"CAD")==3)
         TrendDown2 = true;}   
   
   if (Auto==0) //Ïàðíûé òðåéäèíã
   { 
       if((TrendUP && TrendDown) || (!TrendUP && !TrendDown)) //Ïðîâåðÿåì îòíîñèòüñÿ ëè âàëþòà(û) ê òîðãîâîé ñåññèè íà 1-îì ãðàôèêå
       {
         if(TrendUP2) // Íàïðàâëåíèå òðåíäà ¹2
         {
         Money2_SELLorBUY="Buy";
         Money1_SELLorBUY="Sell";
         }
         if(TrendDown2) // Íàïðàâëåíèå òðåíäà ¹2
         {
         Money2_SELLorBUY="Sell";
         Money1_SELLorBUY="Buy";
         } 
       } 
       else
       {
         if(TrendUP) // Íàïðàâëåíèå òðåíäà ¹1
         {
         Money1_SELLorBUY="Buy";
         Money2_SELLorBUY="Sell";
         }
         if(TrendDown) // Íàïðàâëåíèå òðåíäà ¹1
         {
         Money1_SELLorBUY="Sell";
         Money2_SELLorBUY="Buy";
         }
       }  
     }

   if (Auto==1) //Çåðêàëüíûé òðåéäèíã
   { 
       if((TrendUP && TrendDown) || (!TrendUP && !TrendDown)) //Ïðîâåðÿåì îòíîñèòüñÿ ëè âàëþòà(û) ê òîðãîâîé ñåññèè íà 1-îì ãðàôèêå
       {
         if(TrendUP2) // Íàïðàâëåíèå òðåíäà ¹2
         {
         Money2_SELLorBUY="Buy";
         Money1_SELLorBUY="Buy";
         }
         if(TrendDown2) // Íàïðàâëåíèå òðåíäà ¹2
         {
         Money2_SELLorBUY="Sell";
         Money1_SELLorBUY="Sell";
         } 
       } 
       else
       {
         if(TrendUP) // Íàïðàâëåíèå òðåíäà ¹1
         {
         Money1_SELLorBUY="Buy";
         Money2_SELLorBUY="Buy";
         }
         if(TrendDown) // Íàïðàâëåíèå òðåíäà ¹1
         {
         Money1_SELLorBUY="Sell";
         Money2_SELLorBUY="Sell";
         }
       }  
     }
if(!TrendUP && !TrendDown && !TrendUP2 && !TrendDown2)
CorrelationF=false;
}
///TRand (for Auto trading)
}}

//OpenOrder:
if (CorrelationF==true && (Monday1==strTime.day_of_week||Tuesday2==strTime.day_of_week||Wednesday3==strTime.day_of_week||Thursday4==strTime.day_of_week||Friday5==strTime.day_of_week))
{
if (ticket1==0 && ticket2==0)
{starttime = TimeCurrent(); //Âðåìÿ îòêðûòèÿ ïîçèöèé
HistorySelect(starttime,TimeCurrent()); //Óçíàåì ñêîëüêî ó íàñ ñäåëîê äî òîãî êàê îòêðîåì ïîçèöèè
Deals = HistoryDealsTotal();} //Óçíàåì ñêîëüêî ó íàñ ñäåëîê äî òîãî êàê îòêðîåì ïîçèöèè
i=0;
  while (ticket1==0 && Try>i)
   {
   bid   =SymbolInfoDouble(Money1,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money1,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   point =SymbolInfoDouble(Money1,SYMBOL_POINT);//Çàïðîñ Point
   i =i+1;
   if (StringLen(Money1_SELLorBUY)==3)
   ticket1=MyOrderSend(Money1,ORDER_TYPE_BUY,Lot1,ask,3,bid-StopLoss*point,ask+TakeProfit*point,"",0,0,Blue);
   else
   ticket1=MyOrderSend(Money1,ORDER_TYPE_SELL,Lot1,bid,3,ask+StopLoss*point,bid-TakeProfit*point,"",0,0,Red);
   }
i=0;
   while (ticket2==0 && Try>i)
   {
   bid   =SymbolInfoDouble(Money2,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money2,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   point =SymbolInfoDouble(Money2,SYMBOL_POINT);//Çàïðîñ Point
   i =i+1;
   if (StringLen(Money2_SELLorBUY)==3)
   ticket2=MyOrderSend(Money2,ORDER_TYPE_BUY,Lot2,ask,3,bid-StopLoss*point,ask+TakeProfit*point,"",0,0,Blue);
   else
   ticket2=MyOrderSend(Money2,ORDER_TYPE_SELL,Lot2,bid,3,ask+StopLoss*point,bid-TakeProfit*point,"",0,0,Red);
   }
//}
//}

if (ticket1!=0 && ticket2!=0)
{
CorrelationF=false;
start=false;
order1=0;
order2=0;

//Æäåì îòêðûòèÿ ïîçèöèè(é)
int NeedDeals = Deals+2; //Ïðèäàòîê - ñêîëüêî æäàòü ïîçèöèé
while (Deals<NeedDeals)
{
Sleep(100);
HistorySelect(starttime,TimeCurrent());
Deals = HistoryDealsTotal();
}
//Æäåì îòêðûòèÿ ïîçèöèè(é)

   do //Æäåì ïðèáûëü
   {
   Sleep(10);
   bid   =SymbolInfoDouble(Money1,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money1,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   if (StringLen(Money1_SELLorBUY)==3)
    {if (!OrderCalcProfit(ORDER_TYPE_BUY,Money1,Lot1,ticket1,bid,OrderProfit1))
    OrderProfit1=0;}
   else
    {if (!OrderCalcProfit(ORDER_TYPE_SELL,Money1,Lot1,ticket1,ask,OrderProfit1))
    OrderProfit1=0;}
   
   bid   =SymbolInfoDouble(Money2,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money2,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   if (StringLen(Money2_SELLorBUY)==3)
    {if (!OrderCalcProfit(ORDER_TYPE_BUY,Money2,Lot2,ticket2,bid,OrderProfit2))
    OrderProfit2=0;}
   else
    {if (!OrderCalcProfit(ORDER_TYPE_SELL,Money2,Lot2,ticket2,ask,OrderProfit2))
    OrderProfit2=0;}

      //Îòñëåæèâàåì TakeProfit èëè StopLoss. Åñëè òàêàÿ åñòü æäåì çàêðûòèå âòîðîé ïîçèöèè.
      HistorySelect(starttime,TimeCurrent());
      ulong last_deal=HistoryDealGetTicket(HistoryDealsTotal()-1);
      string nSymbol;
      if (HistoryDealGetString(last_deal,DEAL_COMMENT,nTypeEntry) && HistoryDealGetString(last_deal,DEAL_SYMBOL,nSymbol))
         {if ((StringFind(nTypeEntry,"sl") !=-1 || StringFind(nTypeEntry,"tp") != -1) && nSymbol == Money1)
         {
            i=0;
            while (1)
            {
            Sleep(100);
            i=i+1;
            HistorySelect(starttime,TimeCurrent());
            if (MathMod(i,2)==0)
            last_deal=HistoryDealGetTicket(HistoryDealsTotal()-1);
            else
            last_deal=HistoryDealGetTicket(HistoryDealsTotal()-2);
            if (HistoryDealGetString(last_deal,DEAL_COMMENT,nTypeEntry) && HistoryDealGetString(last_deal,DEAL_SYMBOL,nSymbol))
            if ((StringFind(nTypeEntry,"sl") !=-1 || StringFind(nTypeEntry,"tp") != -1) && nSymbol == Money2)
            {order1 = true;
            order2 = true;
            break;}
            }
         break;
         }
         if ((StringFind(nTypeEntry,"sl") !=-1 || StringFind(nTypeEntry,"tp") != -1) && nSymbol == Money2)
         {
            i=0;
            while (1)
            {
            Sleep(100);
            i=i+1;
            HistorySelect(starttime,TimeCurrent());
            if (MathMod(i,2)==0)
            last_deal=HistoryDealGetTicket(HistoryDealsTotal()-1);
            else
            last_deal=HistoryDealGetTicket(HistoryDealsTotal()-2);
            if (HistoryDealGetString(last_deal,DEAL_COMMENT,nTypeEntry) && HistoryDealGetString(last_deal,DEAL_SYMBOL,nSymbol))
            if ((StringFind(nTypeEntry,"sl") !=-1 || StringFind(nTypeEntry,"tp") != -1) && nSymbol == Money1)
            {order1 = true;
            order2 = true;
            break;}
            }
         break;
         }}
      //Îòñëåæèâàåì TakeProfit èëè StopLoss. Åñëè òàêàÿ åñòü æäåì çàêðûòèå âòîðîé ïîçèöèè.
    
   }
   while ((OrderProfit2+OrderProfit1)<Profit); //Æäåì ïðèáûëü

ticket1=0;
ticket2=0;
if (order2==0 && order1==0)
Print(" > Double trading. Ïðèáûëü: ", NormalizeDouble((OrderProfit2+OrderProfit1),2));
}
}

//TakeProfit:
i=0;
if ((OrderProfit2+OrderProfit1)>=Profit)
{
   while (order2==0 && Try>i)
   {
   bid   =SymbolInfoDouble(Money2,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money2,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   point =SymbolInfoDouble(Money2,SYMBOL_POINT);//Çàïðîñ Point
   if (StringLen(Money2_SELLorBUY)==3)
   order2=MyOrderSend(Money2,ORDER_TYPE_SELL,Lot2,bid,3,ask+StopLoss*point,bid-TakeProfit*point,"",0,0,Red);
   else
   order2=MyOrderSend(Money2,ORDER_TYPE_BUY,Lot2,ask,3,bid-StopLoss*point,ask+TakeProfit*point,"",0,0,Blue);
   i=i+1;
   }
 i=0;
   while (order1==0 && Try>i)
   {
   bid   =SymbolInfoDouble(Money1,SYMBOL_BID); // Çàïðîñ çíà÷åíèÿ Bid
   ask   =SymbolInfoDouble(Money1,SYMBOL_ASK); // Çàïðîñ çíà÷åíèÿ Ask
   point =SymbolInfoDouble(Money1,SYMBOL_POINT);//Çàïðîñ Point
   if (StringLen(Money1_SELLorBUY)==3)
   order1=MyOrderSend(Money1,ORDER_TYPE_SELL,Lot1,bid,3,ask+StopLoss*point,bid-TakeProfit*point,"",0,0,Red);
   else
   order1=MyOrderSend(Money1,ORDER_TYPE_BUY,Lot1,ask,3,bid-StopLoss*point,ask+TakeProfit*point,"",0,0,Blue);
   i=i+1;
   }   
}
//----
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---