Нужна помощь програмистов.

 

Здравстуйте!

У меня такая проблема! Мне нужно прикрутить мартингейл к советнику.

При достижении определённого убытка нужно выбрать убыточный ордер, модифицировать его тейк профит, и открыть такой же ордер, как и модифицированный, только с другим лотом.

Вроде бы с кодом разобрался. Но возникла проблема. При открытии нового ордера с другим лотом, их открывается огромное множество! А нужно, что бы открывался один. При открытии нового ордера с тем же лотом, всё работает нормально, а с другим лотом их открывается столько, сколько тиков при данном условии.

Вот код:

if(OrderSell==1 || OrderBuy==1)
{
for(cnt=0;cnt<OrdersTotal();cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
if(OrderSymbol()!=Symbol()) continue;
if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
{
for(q=0;q<1;q++){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red);}
}

if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
{
for(q=0;q<1;q++){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);}
}
}

}

Работает нормально!

if(OrderSell==1 || OrderBuy==1)
{
for(cnt=0;cnt<OrdersTotal();cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)
if(OrderSymbol()!=Symbol()) continue;
if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
{
for(q=0;q<1;q++){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
OrderSend(Symbol(), OP_SELL, Lots*2, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red);}
}

if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
{
for(q=0;q<1;q++){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red);
OrderSend(Symbol(), OP_BUY, Lots*2, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);}
}
}

}

Ненормально!

Помогите разобраться, где ошибка?

Заранее благодарю за подсказку!

 

Для вставки кода используй кнопочку SRC.

Расставь фигурные скобки по глубине залегания.

Тогда, м.б. и сам разберешься. Но :

if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)

if(OrderSymbol()!=Symbol()) continue;

словами, если ордер невыбран, то если он с другой пары, идем на следуюшую итерацию.

Бред

 
hhohholl:

Для вставки кода используй кнопочку SRC.

Расставь фигурные скобки по глубине залегания.

Тогда, м.б. и сам разберешься. Но :

if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false)

if(OrderSymbol()!=Symbol()) continue;

словами, если ордер невыбран, то если он с другой пары, идем на следуюшую итерацию.

Бред



Вот код:

if(OrderSell==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
         OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red);
        }
       }
     } 
    }
if(OrderBuy==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
         OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);
        }
       }
     }
    }     

Где здесь ошибка? Почему открывает множество ордеров?

OrderSend(Symbol(), OP_BUY, Lots, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);

Здесь все нормально! При Lots открывается только один ордер! А при Lots*5 много?

 

попробуйте вот этот код. может получится.

bool Lock=false; // заглушка

if(OrderSell==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
         if(OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red) && !Lock){
            Lock=true;
          }
        }
       }
     } 
    }
if(OrderBuy==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
         if(OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green) && !Lock){
             Lock=true;
          }
        }
       }
     }
    }     
 
DominoesFX:

попробуйте вот этот код. может получится.


bool Lock=false; // заглушка

if(OrderSell==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
         if(OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red) && !Lock){
            Lock=true;
          }
        }
       }
     } 
    }
Lock=false; // заглушка
if(OrderBuy==1)
   {
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
     if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
     if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
       {
        for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
         if(OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green) && !Lock){
             Lock=true;
          }
        }
       }
     }
    }     
 
Vinin:


:) Пардон, про второй "Lock=false; // заглушка" забыл. спасибо за поправку.
 

Вообще-то, конструкция -

  for(q=0;q<1;q++)
        {
         OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
         if(OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green) && !Lock){
             Lock=true;
          }
        }

равнозначна

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red);  
if(OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green) && !Lock) {Lock=true;}

И еще один совет: для хорошей читабельности вложений,

открывающую и закрывающую скобки ( {} ) ставь строго по вертикали (на одном расстоянии от борта).

 

И еще -

int Total=OrdersTotal();
if(OrderSell==1)
 {
  for(cnt=0; cnt<Total; cnt++)
   {
    if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
    if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
      OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red);
     }
   }
 } 
if(OrderBuy==1)
 {
  for(cnt=0; cnt<Total; cnt++)
   {
    if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
    if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
      OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);
     }
   }
 }

Я так думаю.

Не вдаваясь в логику

&& OrderProfit()<-Spred && OP<MA33 && CL>MA33
и
&& OrderProfit()<-Spred && OP>MA33 && CL<MA33
 

лучше так. тут сразу видно какая скобка закрыта, а какая нет.

bool Lock=false; // Заглушка

if(OrderSell==1){
   for(cnt=0;cnt<OrdersTotal();cnt++){
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)){
         if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33){
            for(q=0;q<1;q++){
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
               if(OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red) && !Lock){
                  Lock=true;
               }
            }
         }
      }
   }
}
   
Lock=false; // Заглушка
if(OrderBuy==1){
   for(cnt=0;cnt<OrdersTotal();cnt++){
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)){
         if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33){
            for(q=0;q<1;q++){
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red);
               if(OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green) && !Lock){
                  Lock=true;
               }
            }
         }
      }
   }
}
 
hhohholl:

И еще -

Я так думаю.

Не вдаваясь в логику

и
int Total=OrdersTotal();

if(OrderSell==1)
 {
  for(cnt=0; cnt<Total; cnt++)
   {
    if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
    if(OrderType()==OP_SELL && OrderProfit()<-Spred && OP>MA33 && CL<MA33)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Bid-TP*Point,Red);
      OrderSend(Symbol(), OP_SELL, Lots*5, Bid, Slip, Bid+SL*Point, Bid-TP*Point, "Ордер SELL",Red);
     }
   }
 } 
if(OrderBuy==1)
 {
  for(cnt=0; cnt<Total; cnt++)
   {
    if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true) 
    if(OrderType()==OP_BUY && OrderProfit()<-Spred && OP<MA33 && CL>MA33)
     {
      OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+TP*Point,Red); 
      OrderSend(Symbol(), OP_BUY, Lots*5, Ask, Slip, Ask-SL*Point, Ask+TP*Point, "Ордер BUY",Green);
     }
   }
 }
Вот это помогло! Спасибо!
Причина обращения: