А давайте сделаем из этого "мультик" (мультивалютник) - страница 7

 
Swan >>:

Было

при true StopLoss присваивается новое значение,

иначе модифицируеться ордер.

ошибки нет, но нада или крестик снять иль штаны одеть)

Не сразу понял))... из-за условия может не выставиться стоп!

Может просто убрать else?? Вроде как и логика не страдает... Для чего второе условие нужно, если и одного достаточно?

StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

Или так...

if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
if(StopLoss-Ask>StopLevel-0.5*Point) StopLoss=MathMin(s0,s1);
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);


Swan >>:

см. сравнение вещественных чисел.

Почитаю... Т.е. это обязательно нужно? Просто ниразу так не делал)

 
ALex2008 >>:

Не сразу понял... из-за условия может не выставиться стоп!

Может просто убрать else?? Вроде как и логика не страдает...

можно и так. наверное) 4h свечка обычно больше StopLevel


ALex2008 >>:

Почитаю... Т.е. это обязательно нужно? Просто ниразу так не делал)

фсякие непонятности возникают, когда сравниваемые величины почти равны)

при проверке числа типа double на равенство - обязательно.


StopLoss-Ask<StopLevel-0.5*Point

по русски: StopLoss минус Ask меньше StopLevel с точностью 0.5*Point

(StopLoss,Ask,StopLevel -нормализованы)

 
StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
вобщем криво получается, подумать надо)
 

Так а этот вариант? Вроде разумно его оставить..

if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
if(StopLoss-Ask>StopLevel-0.5*Point) StopLoss=MathMin(s0,s1);
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

И ещё надо торговый поток проверить, а то тоже сыпятся ошибки, что он занят TradeDispatcher: trade context is busy ... Получается если много копий советника, то все они по сигналу  одновременно закрывают текущие ордера на своих символах и выставляют новые... образуется пробка)

вот так наверное можно..

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask<Enter-StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid>Enter+StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter-Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

т.е. перед закрытием текущего ордера и установкой нового отложенника проверяем торговый поток.. Если занят пауза 1 сек.

 
ALex2008 >>:

Так а этот вариант? Вроде разумно его оставить..

if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
if(StopLoss-Ask>StopLevel-0.5*Point) StopLoss=MathMin(s0,s1);
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

не, так получится. Таки определиться надо)

три варианта:

            StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
            if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
            if(StopLoss-Ask>StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
            if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=Ask+StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin(s0,s1);//Функция возвращает минимальное из двух числовых значений
            if(StopLoss-Ask>StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

ALex2008 писал(а) >>

И ещё надо торговый поток проверить, а то тоже сыпятся ошибки, что он занят... т.к. если много графиков, то все они одновременно закрывают текущие ордера...
int start() {
   if(!IsTradeAllowed()) return(0);

если не поможет, перед всеми OrderSend,OrderModify,OrderClose,OrderDelete проверка IsTradeContextBusy()


ALex2008 >>:
Только куда именно воткнуть, чтоб было правильно пока думаю... А то например старые ордера не удалит, т.к. поток занят, а новые наставит.. а по условию нужно ставить новые только тогда, когда все старые ордера удалены.

переписать проще. в функциях UpTrend() и DownTrend() проверка условий, ордера удаляются и ставятся,

слишком многа фсякого разного)

 
Swan >>:

не, так получится. Таки определиться надо)

Я не понял - получится или не получится?))

 
ALex2008 >>:

Я не понял - получится или не получится?))

*не получиться.

в последнем твоем варианте

         if(Type==0){
            if(Bid-StopLoss<StopLevel-0.5*Point) StopLoss=MathMin(b0,b1); 
            if(Bid-StopLoss>StopLevel-0.5*Point) StopLoss=MathMax(b0,b1);
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);

в первом if() StopLoss не определен.

 
Swan >>:

*не получиться.

в последнем твоем варианте

в первом if() StopLoss не определен.


так а это что?

в первом if  стоп принимает минимальный(по прайсу) лоу из 2 свечей..т.е. удаленный от ордера

StopLoss=MathMin(b0,b1); 

во втором if стоп принимает максимальный(по прайсу) лоу из 2 свечей..т.е. приближенный к ордеру


StopLoss=MathMax(b0,b1);
 
ALex2008 >>:
         if(Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid-StopLoss<StopLevel-0.5*Point) StopLoss=MathMin(b0,b1); 
            if(Bid-StopLoss>StopLevel-0.5*Point) StopLoss=MathMax(b0,b1);
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

Ачто именно непонятно?  При входе в функцию он нулевой. Может я чего не понимаю....


Выше есть условие - Если открыт ордер и его стоп =0 то ставим стоп

if ((Type<=1)&&(Stop==0))SetStop();

и сама функция установки стопа


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if(Type==0){
            if(Bid-StopLoss<StopLevel-0.5*Point) StopLoss=MathMin(b0,b1); 
            if(Bid-StopLoss>StopLevel-0.5*Point) StopLoss=MathMax(b0,b1);
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
         if(Type==1){
            if(StopLoss-Ask<StopLevel-0.5*Point) StopLoss=MathMax(s0,s1);
            if(StopLoss-Ask>StopLevel-0.5*Point) StopLoss=MathMin(s0,s1);
            OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Red);
         }
   }
Причина обращения: