Открытие ордера, если словил лося

 

Нужен код, чтобы после пойманного лося открывался ордер в противоположную сторону.

Пробовал писать 

"если (аккаунтбаланс -= стоплосс)

открываем ордер на покупку/продажу"

но так не работает, я новичок


// 

      if(Ask > ima2 && ima > ima1 && Ask > superprofit && check == true && DisplayAlert == true && OrdersTotal() < 1)

      {

         ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, Green);

         if(ticket > 0)

      {

         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);

         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

         

         if(OrderSelect(ticket, SELECT_BY_TICKET))

         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

         Print("Ошибка модификации ордера на покупку");

         else Print("Ошибка открытия ордера на покупку");

         

         // 

         

         for(int i=OrdersHistoryTotal()-1;i>=0;i--)

         {

         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 

         && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {

         if(t<OrderCloseTime()){t=OrderCloseTime();LastProfit+=OrderProfit();}}

         }

         

         if(LastProfit < 0) 

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);

            if(ticket > 0)

      

            SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

            TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

         

            if(OrderSelect(ticket, SELECT_BY_TICKET))

            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

            Print("Ошибка модификации ордера на продажу");

            else Print("Ошибка открытия ордера на продажу");

         }

      }

      }

      

      // 

      if(Bid < ima2 && ima < ima1 && Bid < superprofit1 && check1 == true && DisplayAlert == true && OrdersTotal() < 1)

      {

         ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);

         if(ticket > 0)

      {

         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

         

         if(OrderSelect(ticket, SELECT_BY_TICKET))

         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

         Print("Ошибка модификации ордера на продажу");

         else Print("Ошибка открытия ордера на продажу");

         

         // 

         

         for(int i=OrdersHistoryTotal()-1;i>=0;i--)

         {

         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderType()<2 

         && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {

         if(t<OrderCloseTime()){t=OrderCloseTime();LastProfit+=OrderProfit();}}

         }

         

         if(LastProfit < 0) 

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, Green);

            if(ticket > 0)

      

            TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);

            SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

         

            if(OrderSelect(ticket, SELECT_BY_TICKET))

            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

            Print("Ошибка модификации ордера на покупку");

            else Print("Ошибка открытия ордера на покупку");

         }

      }

  }

Пробовал так, но это не работает

 

У меня это работает так:

bool CloseOrder1()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))
        {
         Print("Orders not found");
        }
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderMagicNumber()!=Magic1) continue;
      if(OrderType()==OP_BUY)
        {
         if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrAqua))
           {
            PlaySound("CoinsDrop2.wav");
            if(MartinOrder==true && OrderProfit()<0&&CheckVolumeValue(OrderLots()*2)==true&&
               TimeToStr(TimeCurrent(),TIME_MINUTES)>=StartTime && TimeToStr(TimeCurrent(),TIME_MINUTES)<StopTime)
              {
               if(NormalizeDouble(((OrderOpenPrice()-Bid)/2),Digits)>StopLevel)
                 {
                  if(OrderSend(NULL,OP_SELL,OrderLots()*2,Bid,Slippage,OrderOpenPrice(),
                     (Bid-NormalizeDouble(((OrderOpenPrice()-Bid)/2),Digits)),"MartinOrderSell",Magic3,0,Red))
                     Print("MartinOrderSell");
                 }
               else
                 {
                  if(OrderSend(NULL,OP_SELL,OrderLots()*2,Bid,Slippage,Ask+StopLevel,
                     Bid-StopLevel,"MartinOrderSell",Magic3,0,Red))
                     Print("MartinOrderSell");
                 }
              }
           }
        }
     }
   return (true);
  }

Здесь для Вас может быть много лишнего, можно переписать условия по своему...

Либо искать последний убыточный ордер и после этого открывать противоположный с нужными параметрами...

 
Так можно найти лот последнего убыточного ордера:
double FindLastLossOrder()//функция поиска лота последней убыточной сделки
{
   double Lotest=0;
   datetime t=0;
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderMagicNumber()==Magic)
         {
            if(OrderCloseTime()>t)
            {
               if(OrderProfit()<0)
               {
                  Lotest=OrderLots();
               } 
               t=OrderCloseTime();
            }
         }
      }
   }
   return(Lotest);
}
Причина обращения: