Как эксперту открывать ордер в любой момент времени - страница 2

 
Спасибо!
 
Aleksei Stepanenko:
Спасибо!

Здраствуйте Алексей. Добавил в код ещьо одно условие. Я хочу чтоб советник торговал толька когда на таймфрейме Н1 индиактор %BB в неком диапазоне, соответствено на М15 боковое движение. Дополнил код но на тестере ордера не открываются. Может Ви подскажите в чем дело.

#property version   "1.00"
#property strict

input int    Bands_period = 20;
input double Bands_deviation = 2;

input int StopLoss   =0;
input int TakeProfit =0;
input double Lots       =0.1;
input int Magic=16384;

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
int digits;
double point;
double loss, profit;

double Price, Price1;
double LB, UB, LB1, UB1, ma;
double cBB;

int total, result, ticket;

int OnInit()
   {
   symbol=Symbol();
   frame=(ENUM_TIMEFRAMES)Period();
   digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   Price= iClose(symbol,frame,0);
   LB = iBands(symbol,frame, Bands_period, Bands_deviation, 0, PRICE_CLOSE, MODE_LOWER, 0);
   UB = iBands(symbol,frame, Bands_period, Bands_deviation, 0, PRICE_CLOSE, MODE_UPPER, 0);
   ma = iMA(symbol,frame, 20, 0, 0, PRICE_CLOSE, 0);
   LB1 = iBands(symbol,PERIOD_H1, Bands_period, Bands_deviation, 0, PRICE_CLOSE, MODE_LOWER, 0);
   UB1 = iBands(symbol,PERIOD_H1, Bands_period, Bands_deviation, 0, PRICE_CLOSE, MODE_UPPER, 0);
   cBB = (Price1 - LB1)/(UB1 - LB1) * 100;

   
//-------------------------------------------Закрытие позиций------------------------------------------   
   total=OrdersTotal();
   for(int cnt=total-1; cnt>=0; cnt--)
      {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderType()<=OP_SELL && OrderSymbol()==symbol && OrderMagicNumber()==Magic)
         {
         if(OrderType()==OP_BUY && Price>=ma || cBB >=30 || cBB <= 70)   
            {
            result=OrderClose(OrderTicket(),OrderLots(),Bid,50,clrViolet);
            }    
         if(OrderType()==OP_SELL && Price<=ma || cBB >=30 || cBB <= 70)   
            {
            result=OrderClose(OrderTicket(),OrderLots(),Ask,50,clrViolet);
            }
         }
      }
//-----------------------------------------------Открытие позиции------------------------------------
   if(total==0) // если нет позиций
      {
      // открытие длинной позиции
      if(Price<=LB && cBB >=30&& cBB <= 70)
        {
        loss=(StopLoss!=0)?(NormalizeDouble(Ask-StopLoss*point,digits)):0;
        profit=(TakeProfit!=0) ? NormalizeDouble(Ask+point*TakeProfit,digits):0;
        ticket=OrderSend(symbol,OP_BUY,Lots,NormalizeDouble(Ask,digits),50,loss,profit,"Длинная позиция",Magic,0,clrRed);
        }
      // открытие короткой позиции
      if(Price>=UB && cBB >=30&& cBB <= 70)
         {
         loss=(StopLoss!=0) ? NormalizeDouble(Bid+StopLoss*point,digits):0;
         profit=(TakeProfit!=0) ? NormalizeDouble(Bid-point*TakeProfit,digits):0;
         ticket=OrderSend(symbol,OP_SELL,Lots,NormalizeDouble(Bid,digits),50,loss,profit,"Короткая позиция",Magic,0,clrRed);
         }
      }
       return;
   }
  
 

Ваше условие некорректно:

if(OrderType()==OP_BUY && Price>=ma || cBB >=30 || cBB <= 70)   

когда чередуются И и ИЛИ, нужно выделять скобками основную мысль, иначе машина не понимает, какой Вы закладываете смысл.

Здесь написано если ордер бай И прайс больше МА ИЛИ СВВ больше= 30 ИЛИ СВВ меньше= 70

ИЛИ относительно каких членов И? Нужны скобки, чтобы не было разночтений. Это важное замечание на будущее программирование. Например:

if((OrderType()==OP_BUY && Price>=ma) || cBB >=30 || cBB <= 70)   

if(OrderType()==OP_BUY && (Price>=ma || cBB >=30 || cBB <= 70))   


А в данном случае, если Вы накладываете дополнительные условие, то нужно И:

if(OrderType()==OP_BUY && Price>=ma && cBB >=30 && cBB <= 70)   


И у Вас что-то с формулой не правильно. Напишите:

cBB = (Price1 - LB1)/(UB1 - LB1) * 100;
printf(DoubleToString(cBB)+" = ("+DoubleToString(Price1)+" - "+DoubleToString(LB1)+")/("+DoubleToString(UB1)+" - "+DoubleToString(LB1)+")*100");

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


PS Если тип функциии void, то return в конце не обязателен.

 
Aleksei Stepanenko:

Ваше условие некорректно:

когда чередуются И и ИЛИ, нужно выделять скобками основную мысль, иначе машина не понимает, какой Вы закладываете смысл.

Здесь написано если ордер бай И прайс больше МА ИЛИ СВВ больше= 30 ИЛИ СВВ меньше= 70

ИЛИ относительно каких членов И? Нужны скобки, чтобы не было разночтений. Это важное замечание на будущее программирование. Например:


А в данном случае, если Вы накладываете дополнительные условие, то нужно И:


И у Вас что-то с формулой не правильно. Напишите:

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


PS Если тип функциии void, то return в конце не обязателен.

Машина понимает по первому варианту, И скрепляет между собой, а ИЛИ сами по себе.

 
Valeriy Yastremskiy:

Машина понимает по первому варианту, И скрепляет между собой, а ИЛИ сами по себе.

Точно! Вопрос, понимаем ли её мы?



С новым годом, друзья

 
Aleksei Stepanenko:

Точно! Вопрос, понимаем ли её мы?

С новым годом, друзья

Тоже везде ставлю скобки для исключения неоднозначности понимания (и компилятором и человеком). Хотя если вызубрить приоритеты операций, то можно глаза не насиловать кучей скобок, но я ещё не дорос))

https://docs.microsoft.com/ru-ru/cpp/cpp/cpp-built-in-operators-precedence-and-associativity?view=msvc-160

С новым годом!)

Встроенные операторы, приоритет и ассоциативность C++
Встроенные операторы, приоритет и ассоциативность C++
  • 2020.07.23
  • corob-msft
  • docs.microsoft.com
Дополнительные сведения: встроенные операторы, приоритетность и ассоциативность C++
 
Aleksey Mavrin:

Тоже везде ставлю скобки

++

 
Aleksei Stepanenko:

++

Скобки признак хорошего тона)))