Не работает модификация ордеров

 

Здравствуйте. У меня в процессе написания советника возникла проблема в модификации ордеров. По задумке требуется чтобы после каждого нового открытого ордера происходила модификация тейков всех ранее открытых позиций. У всех должен быть одинаковый тейк. Но на деле происходит модификация только первого ордера, а после его срабатывания происходит многочисленное открытие ордеров без модификаций.

Вот код самого советника.

 extern double Lots = 0.01;
extern double TakeProfit = 260;
extern double PipStep = 500;
extern double LotExponent = 1.3;
extern double LotsDigits=2; // 2 - микролоты 0.01, 1 - мини лоты 0.1, 0 - нормальные лоты 1.0
int MagicNumberBuy = 795;
string Name = "MarinPRO v.2.5";
double tLotsBuy;
int ticket, cnt;
bool buy=false; //нет открытых баев
bool buy1=true; //можно открыть бай
int ticsell,ticbuy; // тикер селов
double VsegoBuy; // всего позиций бай
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
tLotsBuy=NormalizeDouble(Lots*MathPow(LotExponent,VsegoBuy),LotsDigits); //работает по мартингейлу
//========================================проверка на закрытие бая====================================================
for(cnt=OrdersHistoryTotal()-1;cnt>=0;cnt--)
{ RefreshRates();
OrderSelect(ticbuy,SELECT_BY_TICKET,MODE_HISTORY);
if(OrderSymbol()!=Symbol()&& OrderMagicNumber()!=MagicNumberBuy) continue;
if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumberBuy)
{buy=false;
buy1=true;
VsegoBuy=0;
Print("Бай ",buy, " и бай1 ",buy1);
}
}
if ((buy==false && buy1==true)||(buy==true && buy1==true))
{ RefreshRates();
ticbuy=OrderSend(Symbol(),OP_BUY,tLotsBuy,Ask,3,0,0,Name,MagicNumberBuy,0,Blue);
buy1=false;
buy=true;

//===========================================модификация бай============================================================
double priceBuy=0; // уровень рассчета среднего профита

double targetBuy; // уровень тейков для нескольких поз

for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{ RefreshRates();
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol()&& OrderMagicNumber()!=MagicNumberBuy) continue;
if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumberBuy)
{priceBuy=NormalizeDouble(priceBuy+OrderOpenPrice(),Digits);
VsegoBuy=VsegoBuy+1;
if (VsegoBuy>1)
{priceBuy=NormalizeDouble((OrderOpenPrice()-priceBuy)/2,Digits);
targetBuy=NormalizeDouble(priceBuy+TakeProfit/100000, Digits);
}
else
{priceBuy=NormalizeDouble(OrderOpenPrice(),Digits);
targetBuy=NormalizeDouble(priceBuy+TakeProfit/100000, Digits);
}
}
}
for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{ RefreshRates();
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol()&& OrderMagicNumber()!=MagicNumberBuy) continue;
if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumberBuy)
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(targetBuy*100000*Point,Digits),0,Red);
}
}
}
//===============================открытие вторых позиций бай=============================================
for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
{ RefreshRates();
OrderSelect(ticbuy,SELECT_BY_TICKET,MODE_TRADES);
if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumberBuy)
{
if (OrderOpenPrice()-Ask>=PipStep*Point) // пипстеп прошел уровень открытия позиции buy
{buy1=true;
}
}


}
//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
return(0);
}






 

//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

зачем стоко Х много?

 
dem220:

Здравствуйте. У меня в процессе написания советника возникла проблема в модификации ордеров. По задумке требуется чтобы после каждого нового открытого ордера происходила модификация тейков всех ранее открытых позиций. У всех должен быть одинаковый тейк. Но на деле происходит модификация только первого ордера, а после его срабатывания происходит многочисленное открытие ордеров без модификаций.

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

Нужно исправить все три оператора if, так правильно:

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumberBuy) continue;

Поскольку:

!(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumberBuy) == ( !(OrderSymbol() == Symbol()) || !(OrderMagicNumber() == MagicNumberBuy) )

Насчет модификаций - не знаю, а с открытиями должно помочь

Кстати, следующий if() будет не нужен

 

Почему бы Вам не написать вот так:

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(targetBuy,Digits),0,Red); 
 

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumberBuy) continue;

Спасибо, исправил. Но проблема с модификацией, как вы и говорили, осталась. 

 
dem220:

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumberBuy) continue;

Спасибо, исправил. Но проблема с модификацией, как вы и говорили, осталась.


С модификацией проблемы в тестере?

Если, напротив, при торговле, то это легко объяснимо и поправимо (хотя и объемно) .

 

у вас ошибка в вычислении тейкпрофита

                        if (VsegoBuy>1)
                        {
                                priceBuy=NormalizeDouble((OrderOpenPrice()-priceBuy)/2,Digits);
                                targetBuy=NormalizeDouble(priceBuy+TakeProfit*Point, Digits);
                        }
                        else
                        {
                                priceBuy=NormalizeDouble(OrderOpenPrice(),Digits);
                                targetBuy=NormalizeDouble(priceBuy+TakeProfit*Point, Digits);
                        } 

 

разберитесь с этими значяениями 

 

Или объясните что должно быть на выходе в случае VsegoBuy>1, и VsegoBuy<=1

 

Первый вариант я недоглядел. У вас рыночные ордеры модифицируются.

Почему бы Вам не написать вот так:

OrderModify(OrderTicket(),0,OrderStopLoss(),NormalizeDouble(targetBuy,Digits),0,Red); 

 
api:

Первый вариант я недоглядел. У вас рыночные ордеры модифицируются.

Почему бы Вам не написать вот так:


в этом ошибки нет. Вы на тест эксп запускали? 

Ошибка - в параметре  targetBuy. Там на выходе поллучается цифра типа 0,00026. Что не есть корректно.
Ошибка в условии там, где я показал выше.

 

Когда-то столкнулся с проблемой, что рыночные ордера не модифицирует, если указывать цену открытия, отличную от нуля. С targetBuy действительно накручено, но я не проверял и не запускал.

Когда работает эта ветка - врядли будет 0.00026

priceBuy=NormalizeDouble(OrderOpenPrice(),Digits);
targetBuy=NormalizeDouble(priceBuy+TakeProfit/100000, Digits);
 

да. при первом запуске, когда выполняется else,  то считает корректно.

но потом какая то глупость. Но я не знаю что автор хотел тем вычислением сделать. то есть куда он хотел двигать этот тейкпрофит.

Причина обращения: