//+------------------------------------------------------------------+
//|                                                     MartinForum.mq4 |
//|                                              |
//|                                              |
//-------------------------------------------------------------------+
extern int Magic=111111;   
extern int time =1;
extern int volume=1;
extern double StartLots = 1;
extern double LotDouble=2;                      //Коэффициент мартингейла
extern int Stop=0;                             //Стоплосс
extern int Take=0;                             //Тейкпрофит
extern int BuyOrSell=0;                         //Направление первого ордера 0- Buy, 1-Sell
extern int UseWorkTime=0;                       //Использовать время 1-да 0-нет
extern int TimeStart=0;                         //Время начала торговли
extern int TimeStop=24;                         //Время завершения торговли 
extern bool UseSound = False;                    //Использовать звуковой сигнал
 

int MaxTries=5;
int i,cnt=0, ticket, mode=0, digit=0;
double Lotsi=0;
double StopLoss, TakeProfit;
string name="MartinForum";
int Dec=10, total=0, LastOrdType;
double LastLot;
bool  OrderToday=false;
string SoundSuccess   = "alert.wav";      // Звук успеха
string SoundError     = "timeout.wav"; // Звук ошибки

int init()
  {
   return(0);
  }

int start()

  {//
if (Volume[0]<=volume)close();//
{
   digit  = MarketInfo(Symbol(),MODE_DIGITS); 
   if (digit==5 || digit==3) Dec=10;
   if (digit==4 || digit==2) Dec=1;   
   Lotsi = StartLots;

      StopLoss=Stop*Dec*Point;
      TakeProfit=Take*Dec*Point;  
   
   if (ScanTradesOpen(Magic)==0 && BuyOrSell==0 && OrderToday==false) 
   {
   if (UseWorkTime==1 && (Hour()<TimeStart || Hour()>=TimeStop)) return(0);
   BuyMarketOrdOpen(Blue,Magic);            
   }
   if (ScanTradesOpen(Magic)==0 && BuyOrSell==1 && OrderToday==false)
   {
   if (UseWorkTime==1 && (Hour()<TimeStart || Hour()>=TimeStop)) return(0);
   SellMarketOrdOpen(Red,Magic);        
   }
   if (ScanTradesOpen(Magic)==0 && OrderToday==true) 
   {
   if (LastOrdInfo(Magic)==1 && LastOrdType==OP_BUY) 
   {
   if (UseWorkTime==1 && (Hour()<TimeStart || Hour()>=TimeStop)) return(0);
   Lotsi = StartLots; BuyMarketOrdOpen(Blue,Magic); 
   }
   if (LastOrdInfo(Magic)==1 && LastOrdType==OP_SELL) 
   {
   if (UseWorkTime==1 && (Hour()<TimeStart || Hour()>=TimeStop)) return(0);
   Lotsi = StartLots; SellMarketOrdOpen(Red,Magic);
   } 
   if (LastOrdInfo(Magic)==0 && LastOrdInfo2(Magic)==1 && LastOrdType==OP_SELL) {Lotsi = LastLot*LotDouble; BuyMarketOrdOpen(DeepSkyBlue,Magic);}
   if (LastOrdInfo(Magic)==0 && LastOrdInfo2(Magic)==1 && LastOrdType==OP_BUY) {Lotsi = LastLot*LotDouble; SellMarketOrdOpen(LightSalmon,Magic);}
   }
//добавил для - второго ордера
   if (LastOrdInfo(Magic)==0 && LastOrdInfo2(Magic)==0 && LastOrdType==OP_SELL) {Lotsi = LastLot*LotDouble; SellMarketOrdOpen(DeepSkyBlue,Magic);}
   if (LastOrdInfo(Magic)==0 && LastOrdInfo2(Magic)==0 && LastOrdType==OP_BUY) {Lotsi = LastLot*LotDouble; BuyMarketOrdOpen(LightSalmon,Magic);}

}
   return;//
  }//
  
void BuyMarketOrdOpen(int ColorOfBuy,int Magic)
  {
  int try, res;
          
  for (try=1;try<=MaxTries;try++)
       {
       while (!IsTradeAllowed()) Sleep(5000);
       RefreshRates();		  

      res=OrderSend(Symbol(),OP_BUY,Lotsi,NormalizeDouble(Ask ,digit),2*Dec,0,0,""+(string)time,Magic,0,ColorOfBuy);
      Sleep(2000);
      if(res>0)
           {
            OrderToday=true;
            if (UseSound) PlaySound(SoundSuccess);
            if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) break;
            }
         else 
         {
         if (UseSound) PlaySound(SoundError);
         Print("Error opening BUY order : ",GetLastError(), " Try ", try); 
          if (try==MaxTries) {Print("Warning!!!Last try failed!");}
         Sleep(5000);
         }     
       }
      return;
      }

void SellMarketOrdOpen(int ColorOfSell,int Magic)      
      { 
        int try, res;  

  
 for (try=1;try<=MaxTries;try++)
       {
       while (!IsTradeAllowed()) Sleep(5000);
       RefreshRates();	
       
      res=OrderSend(Symbol(),OP_SELL,Lotsi,NormalizeDouble(Bid ,digit),2*Dec,0,0,""+(string)time,Magic,0,ColorOfSell);
      Sleep(2000);
      if(res>0)
           {
            OrderToday=true;
            if (UseSound) PlaySound(SoundSuccess);
            if(OrderSelect(res,SELECT_BY_TICKET,MODE_TRADES)) break;
            }
         else 
         {
         if (UseSound) PlaySound(SoundError);
         Print("Error opening SELL order : ",GetLastError(), " Try ", try); 
         if (try==MaxTries) {Print("Warning!!!Last try failed!");} 
         Sleep(5000);
        }
      }
      return;
      }
      

int ScanTradesOpen(int Magic)
{   
   total = OrdersTotal();
   int numords = 0;
      
   for(cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)  && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}

  
double LastOrdInfo(int Magic)
{
      int cnt=OrdersHistoryTotal(); 
      while(cnt>0)
      {
      if (OrderSelect(cnt-1, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol()==Symbol()) 
      { 
      LastLot=OrderLots();
      LastOrdType=OrderType();
      if (OrderProfit()>0) return(1);
      if (OrderProfit()<0) return(0);
    
      }
      cnt=cnt-1; 
      }    
}
// выбираем минус второй ордер
double LastOrdInfo2(int Magic)
{
      int cnt=OrdersHistoryTotal(); 
      while(cnt>0)
      {
      if (OrderSelect(cnt-2, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == Magic && OrderSymbol()==Symbol()) 
      { 
      LastLot=OrderLots();
      LastOrdType=OrderType();
      if (OrderProfit()>0) return(1);
      if (OrderProfit()<0) return(0);
    
      }
      cnt=cnt-2; 
      }    
}






void close()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
   OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
   if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
   if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 2*Dec, Blue);
   if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 2*Dec, Red);
   }Sleep(1000);}}






