Не работает удаление отложенного ордера - страница 2

 
Reshetov писал(а) >>

А где в условии сказано, что первое должно быть с начала или с конца?

Вы глаза компотом промойте и еще раз внимательно перечитайте первый пост. О чем там идет речь?

Или привыкли не читая условий задачи, телепатически решать за других, что должно быть, а чего не должно?

Я благодарю всех, кто откликнулся. Но обсуждение немного отошло от темы. Проблема в том, что без условий, удаление работает. Соответственно удаляются все вновь устанавливаемые ордера. Но стоит поставить условие и все, удаление не работает. Не обязательно именно условие <ТР, можно тупо задать какую-нибудь величину в пунктах, но все-равно не срабатывает. Не пойму почему. Поэтому и обратился за помощью.

 
forex-k >>:

вот функция удаления всех отложек

int close()
{
for(int i=OrdersTotal(); i+1>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
OrderDelete(OrderTicket());
}
}

Выход за пределы массива (списка ордеров в данном случае). Ордер с номером OrdersTotal() не существует.


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

К тому же суммирование в условии - просто "тормоз" для цикла, хотя и малосущественный.


Удачи

 
Kishar >>:
Не получается удаление отложенных ордеров. В данном куске советника удаление должно быть при условии, что цена опустилась ниже ТР, но отложенный ордер не сработал. Перебрал несколько готовых скриптов, экспериментировал, ничего не вышло. Помогите.

А что Вы хотите ?


for(int i=0;i<OrdersTotal();i++)
    int Ticket=OrdersTotal();
  {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderType()==OP_SELLLIMIT && Ask < OrderTakeProfit())
       OrderDelete(Ticket);


Вы вообще то справку по языку читали ? Особро обратите внимание на синтаксис.

Вы циклом присваиваете переменной Ticket одно и то же значение, которое просто указывает ЗА пределы списка ордеров, и еще используете переменные, вне зоны их смысла. Переменная цикла i используется Вами ВНЕ пределов цикла.

for(int i=0;i<OrdersTotal();i++)
    int Ticket=OrdersTotal();

Здесь цикл закончился.


Удачи

 
Kishar писал(а) >>

Я благодарю всех, кто откликнулся. Но обсуждение немного отошло от темы. Проблема в том, что без условий, удаление работает. Соответственно удаляются все вновь устанавливаемые ордера. Но стоит поставить условие и все, удаление не работает. Не обязательно именно условие <ТР, можно тупо задать какую-нибудь величину в пунктах, но все-равно не срабатывает. Не пойму почему. Поэтому и обратился за помощью.

В ф-ции старт есть проверка на количество ордеров.

int total=OrdersTotal();

if (total < 1)
CheckForOpen();

Соответственно если установлен хотя бы один ордер, то вызов ф-ции CheckForOpen на следующем тике не происходит, и не важно какие условия она содержит.

 
VladislavVG писал(а) >>

А что Вы хотите ?

Вы вообще то справку по языку читали ? Особро обратите внимание на синтаксис.

Вы циклом присваиваете переменной Ticket одно и то же значение, которое просто указывает ЗА пределы списка ордеров, и еще используете переменные, вне зоны их смысла. Переменная цикла i используется Вами ВНЕ пределов цикла.

Здесь цикл закончился.

Удачи

То, что в прилагаемом коде - это уже извращения или фантазии, так как по логическим правилам не работает. Просто не восстановил код до нормального.

 
Xupypr писал(а) >>

В ф-ции старт есть проверка на количество ордеров.

int total=OrdersTotal();

if (total < 1)
CheckForOpen();

Соответственно если установлен хотя бы один ордер, то вызов ф-ции CheckForOpen на следующем тике не происходит, и не важно какие условия она содержит.

Вот код

//+------------------------------------------------------------------+
//|                                                    TTTTT.mq4     |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link    ""  

extern int StopLoss=30;
extern int TakeProfit=12;
extern double Lots = 4;
double UpFractals;
double DownFractals;



int ticket, order_ticket;

void start()

{

if(Bars<5 || IsTradeAllowed()==false) return;

int total=OrdersTotal();

if (total < 1)
CheckForOpen();
}


void CheckForOpen()
{
if(Volume[0]>1) return;


double DownFrac1=iFractals(NULL, 0, MODE_LOWER,1);
double DownFrac2=iFractals(NULL, 0, MODE_LOWER,2);
double DownFrac3=iFractals(NULL, 0, MODE_LOWER,3);
double DownFrac4=iFractals(NULL, 0, MODE_LOWER,4);
{

  if (DownFrac2 !=0 && DownFrac1 ==0 && DownFrac3 ==0 && DownFrac4 ==0 && Close[1]-Open[2]>0.0014 && High[1]-Close[1]< 0.0009 && High[2] - Open[2] < 0.0022)
double price=(Close[1] + 0.0012);
double loss=(Close[1] + 0.0012)+ (0.0001*StopLoss); 
double profit=(Close[1] + 0.0012) - (0.0001*TakeProfit);
      
OrderSend(Symbol(),OP_SELLLIMIT,Lots,price,3,loss,profit,"ПРОДАЖА",0,0,Blue); 

{
for(int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
{
if (Ask < OrderTakeProfit())
{
OrderDelete(OrderTicket());
}
}
  }
   }
}
}


// for(int i =  OrdersTotal()-1;i>=0; i--) {
//{
//OrderSelect(i, SELECT_BY_POS) ; 
//if (Open[0] < OrderTakeProfit()) OrderDelete(OrderTicket());
//}
//}
//}
В обоих случаях удалений, что выше, что ниже, если убрать условия ( if (Ask < OrderTakeProfit()) или (Open[0] < OrderTakeProfit()) ) ордера удаляются все подряд без разбора. Но стоит поставить условия, как только выставляется отложенный ордер, который не срабатывает продолжительное время и следовательно его при определенных условиях нужно удалить, удаление не срабатывает.
 

Перенесите часть кода, которая отвечает за удаление в отдельную ф-цию.

И вызывайте её, если условие total < 1 не выполняется. Например так:

if (total < 1) CheckForOpen();

else CheckForDelete();

 
Kishar >>:

Вот код

В обоих случаях удалений, что выше, что ниже, если убрать условия ( if (Ask < OrderTakeProfit()) или (Open[0] < OrderTakeProfit()) ) ордера удаляются все подряд без разбора. Но стоит поставить условия, как только выставляется отложенный ордер, который не срабатывает продолжительное время и следовательно его при определенных условиях нужно удалить, удаление не срабатывает.

А чему должна быть равна переменная "price", если условие


if (DownFrac2 !=0 && DownFrac1 ==0 && DownFrac3 ==0 && DownFrac4 ==0 && Close[1]-Open[2]>0.0014 && High[1]-Close[1]< 0.0009 && High[2] - Open[2] < 0.0022)
double price=(Close[1] + 0.0012);

не выполняется ?

И еще - Вы ее (переменную price) определили в блоке if(), а используете ВНЕ блока (ИМХО - зря разработчики не контролируют зону видимости переменных в МКЛ4) - это так задумано ?


Удачи

 
VladislavVG писал(а) >>

А чему должна быть равна переменная "price", если условие

не выполняется ?

И еще - Вы ее (переменную price) определили в блоке if(), а используете ВНЕ блока (ИМХО - зря разработчики не контролируют зону видимости переменных в МКЛ4) - это так задумано ?

Удачи

Объясню, почему используется price. Она используется в функции OrderSend() в качестве определения цены. Может быть это смешно, но только в этом случае устанавливается SL. В ином случае, если в функции OrderSend() прописать Close[1]+0.0012, выставляется только TP. В данном случае, на мою проблему это не влияет.

 
Kishar >>:

Объясню, почему используется price. Она используется в функции OrderSend() в качестве определения цены. Может быть это смешно, но только в этом случае устанавливается SL. В ином случае, если в функции OrderSend() прописать Close[1]+0.0012, выставляется только TP. В данном случае, на мою проблему это не влияет.

Вы не поняли вопрос: у Вас переменная price инициализируется только в случае истинности условия и зона ее видимости - это условие if(). Все остальное находится ВНЕ if() и переменная price хоть и описана ВНУТРИ if(), но используется ВНЕ if(). Я и спрашиваю - это так задумано ? Или ошибка в реализации ?


Успехов

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