Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 252

 

> err=StringToInteger((string)err)

это вообще должно войти в анналы ;-)

изначально в err вы очевидно получили int из GetLastError(). Сконвертировать код ошибки в читаемое описание ErrorDescription(err); при условии что включен #include <stdlib.mqh>.

а вот так как написано - это жесть

PS/ и не изучайте программирование по MQL. MQL что 4, что 5 всё-же целевые языки для конкретной платформы.

 

подскажите пожалуйста, можно ли так писать. не хочет сделок открывать. может формат расчётных чисел неправильный? или другие недочёты в коде?


double TakeLong(double shp)

{

    int CurrentDayRange=0, FiveDayATR=0, take=0;

    double TP_ATR=0;

    //////Pivot inputs 

         double P, S1, R1, S2, R2, S3, R3;

         double LastHigh, LastLow, x;

         int counted_bars = IndicatorCounted();

         int limit, i;

    

    shp=iHigh(Symbol(),PERIOD_D1,0);


    //---- Pivot indicator calculation

   if(counted_bars == 0)

     {

       x = Period();

       if(x > 240) 

           return(-1);

      }

   if(counted_bars < 0) 

       return(-1);

    limit = (Bars - counted_bars) - 1;

//----

   for(i = limit; i >= 0; i--)

     { 

       if(High[i+1] > LastHigh) 

           LastHigh = High[i+1];

       //----

       if(Low[i+1] < LastLow) 

           LastLow=Low[i+1];

       if(TimeDay(Time[i]) != TimeDay(Time[i+1]))

         { 

           P = (LastHigh + LastLow + Close[i+1]) / 3;

           R1 = (2*P) - LastLow;

           S1 = (2*P) - LastHigh;

           R2 = P + (LastHigh - LastLow);

           S2 = P - (LastHigh - LastLow);

           R3 = (2*P) + (LastHigh - (2*LastLow));

           S3 = (2*P) - ((2* LastHigh) - LastLow); 

           LastLow = Open[i]; 

           LastHigh = Open[i];

         }

      }

        

    ////ATR calculation

    for (i=1;i<6;i++)

    { if(iHigh(NULL, PERIOD_D1, i)- iLow(NULL, PERIOD_D1, i)>0) FiveDayATR += (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i));}

    FiveDayATR = NormalizeDouble(FiveDayATR/5,Digits());

    CurrentDayRange = (iHigh(NULL, PERIOD_D1, i)-iLow(NULL, PERIOD_D1, i));

   

    if(FiveDayATR-CurrentDayRange>0) TP_ATR=Ask+FiveDayATR-CurrentDayRange; else TP_ATR=0; 


   if (Bid>R1 && TP_ATR==0) take=shp;

   else if (Bid<R1 && R1<TP_ATR) take=R1;

   else take=TP_ATR;

   return(take);

}

 
forexpipsrunner:  подскажите пожалуйста, можно ли так писать. не хочет сделок открывать

Предложенный код похож на индикатор. А сделки открывает советник, или скрипт. Вызов функции OrderSend в индикаторе запрещен. Индикатор может сигналить - вставьте в соответствующее место вызов функции Alert или звук

 
STARIJ:

Предложенный код похож на индикатор. А сделки открывает советник, или скрипт. Вызов функции OrderSend в индикаторе запрещен. Индикатор может сигналить - вставьте в соответствующее место вызов функции Alert или звук


это код определения TP, который отдаёт результат в OrderSend . без этого сложного алгоритма сделки отправляются, с ним никак. вызываю функцию  TP = TakeLong(SHP);

    

 
forexpipsrunner:   это код определения TP, который отдаёт результат в OrderSend . без этого алгоритма сделки отправляются, с ним никак

Существует много способов отладки - процесса поиска ошибки, когда установлено, что она есть. Первый - F5 - начать отладку в MetsEditor.  2) с помощью Алертов проследить выполнение. 3 и 4) вывод отладочной информации в текстовые метки и функцией Comment. Выберите удобный для Вас способ и отладьте эту простенькую функцию - тогда Вы станете программистом. Сложной считается программа с тысячами строк.

 
forexpipsrunner:

подскажите пожалуйста, можно ли так писать. не хочет сделок открывать. может формат расчётных чисел неправильный? или другие недочёты в коде?


 

int take=0 - у Вас возвращается целое число, не double ли должен быть у этой переменной?
 
Здраствуйте! Хочу сделать паттерн "рельсы", но никак не могу вычислить размер тела свечи....

Размер тела свеч вычисляю так: 
MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

В полном коде это выглядит так:

double Close1 = iClose(Symbol(), 0, i);
double Open1 = iOpen(Symbol(), 0, i);
double Close2 = iClose(Symbol(), 0, i+1);
double Open2 = iOpen(Symbol(), 0, i+1);

MathAbs( Close1[i] - Open1[i] ) / Point + 1
MathAbs( Close2[i] - Open2[i] ) / Point + 1

if (Close1 < Open1 && Close2 > Open2){
BUY();
}
if (Close1 > Open1 && Close2 < Open2){
SELL();
}

Правильно сделано? Как заставить это работать?
 
sviter-pro:   Здраствуйте! Хочу сделать паттерн "рельсы", но никак не могу вычислить размер тела свечи....

На демо счете М1 пробовали? Что получается?

 
STARIJ:

На демо счете М1 пробовали? Что получается?

Ничего не получается....(((
 
void trailing(string symbol,string comment,int magic,int trail_p)
  {
   if(symbol==NULL) symbol=Symbol();
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symbol && OrderComment()==comment && OrderMagicNumber()==magic)
           {
            switch(OrderType())
              {
               case OP_BUY:
                  if(OrderOpenPrice()+(trail_p*Point)<Ask && OrderStopLoss()+(trail_p*Point)<Ask)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
               case OP_SELL:
                  if(OrderOpenPrice()-(trail_p*Point)>Bid && OrderStopLoss()-(trail_p*Point)>Bid)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()-(trail_p*Point),OrderTakeProfit(),OrderExpiration(),clrNONE))
                       {
                        Print("OrderModify завершилась с ошибкой #",GetLastError());
                       }
                    }
                  break;
              }
           }
        }
        Comment("StopLoss=",OrderStopLoss());
     }
  }

Подскажите, почему трал срабатывает на каждом тике ?

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