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

 
VladislavVG писал(а) >>

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

Успехов

В данном случае это не столько задумывалось так, сколько был поиск варианта при котором в данной функции выполняются все команды. Как я писал, не выставлялся SL, но в этом случае все прекрасно работает. Это тоже самое, что расчет profit или loss.

 
Xupypr писал(а) >>

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

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

if (total < 1) CheckForOpen();

else CheckForDelete();

Следуя вашему совету, перенес удаление в отдельную функцию, все заработало. Спасибо за совет. Если кому интересно, привожу код.

//+------------------------------------------------------------------+
//|                                                    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();
if (total < 1) CheckForOpen();
else CheckForDelete();




}


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); 

}
}
void CheckForDelete()

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




 
Kishar >>:

Это тоже самое, что расчет profit или loss.

У Вас переменные profit и loss расчитываются в любом случае. Переменная же price только в том случае, если выполняется условие под оператром if(). Мало того, так переменная price описана ВНУТРИ условного оператора if(), а используется ВНЕ. И ордер выставляется вне условного оператора if(). Это так задумано ? Мне кажется, что это ошибка, но я могу и ошибаться ....


Успехов.



 
VladislavVG писал(а) >>

У Вас переменные profit и loss расчитываются в любом случае. Переменная же price только в том случае, если выполняется условие под оператром if(). Мало того, так переменная price описана ВНУТРИ условного оператора if(), а используется ВНЕ. И ордер выставляется вне условного оператора if(). Это так задумано ? Мне кажется, что это ошибка, но я могу и ошибаться ....

Успехов.

Ну в принципе, это ошибка, которая особенно не влияет.

 
А есть ли возможность определять, что именно на конкретном баре была открыта позиция?????
 
Дмитрий:

Функция понятна, но как правильно прописать условие, чтобы работало.

У меня с памятью проблемы и я постоянно сталкиваюсь с такими проблемами - то получается все, то забыл; штука не особенная?! Залез посмотреть что к чему. Иногда принцип машины надо вспомнить как она воспроизводит то или иное действие; в программировании это порой важно - думать как думает машина; так же можно ее и обманывать иногда, к примеру: умножить на единицу; она будет думать что произвела какие-то действия, а результат будет таким какой нужен Вам. Я иногда делаю все быстро(когда надо мне), поменял логику местами и залез посмотреть(поискать, что думают люди по этому поводу), посмотрел в терминале результат и смотреть здесь что-либо уже отпало. Я поменял местами открытие ордеров и удаление отложек. Удаление поставил на первое место, открытие на второе. И у удаление убрал цикл - по ходу он там не к чему. Но в ордер селект встал отбиваться от тикета вместо i - ордер тикет и бью-тикет и моде трайдес. И все заработало пока.

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