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

 
spoiltboy:

Добрый. Подскажите, где ошибка? 

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Все работает, выставляет ордер по цене maxpr1. 

Далее я хочу проделать то-же самое, но по цене minpr1:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Пишет ошибка 130 (неправильные стопы). Что я делаю не так?


 При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).

 
Alekseu Fedotov:
Нет, не  в этом дело, зазор там есть. Тем более так-же пытался изменить отложенный на покупку, на том-же графике тестировал, те-же ошибки. 
 
spoiltboy:
Нет, не  в этом дело, зазор там есть. Тем более так-же пытался изменить отложенный на покупку, на том-же графике тестировал, те-же ошибки. 

Зазор зазором, но ты видно не дочитал то что написано

....... В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS)..........

 т. е. Пытаешся  установить      OP_SELLLIMIT ниже рыночной цены.  

 
Alekseu Fedotov:

Зазор зазором, но ты видно не дочитал то что написано

....... В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS)..........

 т. е. Пытаешся  установить      OP_SELLLIMIT ниже рыночной цены.  

Спасиб.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  for(int i2=total-1; i2>=0; i2--)
     if(OrderSelect(i2, SELECT_BY_POS))
         if(OrderSymbol()==Symbol()      )
         if (OrderMagicNumber()==Magic)
      {
      if (OrderType()==OP_BUY)
      {
     if (sig2==1)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
      if (OrderType()==OP_SELL)
      {
     if (sig2==2)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_BUYSTOP)
      {
    
     if (sig2==2&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_SELLSTOP)
      {
  
     if (sig2==1&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
 if (FMA1<GrossMA1 && FMA2>GrossMA2 )     {sig=2;} // селл стоп

  if (FRMA1>GrossMA1 && FRMA2<GrossMA2 )  {sig=1;} // бай стоп      

 

В чем тут ошибка ..Открытые сделки закрываются сами по себе сигнала обратоого нет .. 

 
Movlat Baghiyev:
 if (FMA1<GrossMA1 && FMA2>GrossMA2 )     {sig=2;} // селл стоп

  if (FRMA1>GrossMA1 && FRMA2<GrossMA2 )  {sig=1;} // бай стоп      

 

В чем тут ошибка ..Открытые сделки закрываются сами по себе сигнала обратоого нет .. 

На нулевом баре сигнал "мерцает", что пост-фактум не видно. В тестере на всех тиках визуализацию прогоните, вопросы исчезнут.
 
Vitalie Postolache:
На нулевом баре сигнал "мерцает", что пост-фактум не видно. В тестере на всех тиках визуализацию прогоните, вопросы исчезнут.
проблема не в этом .При срабатывании ордера открывается сделка и она сразу закрывается при появлнии новой свечи и при этом обратного сигнала нет ..Я поэтому привел кусок кода закрытия сделок .По коду вроде как должны дождаться нового сигнала 
 
Movlat Baghiyev:
проблема не в этом .При срабатывании ордера открывается сделка и она сразу закрывается при появлнии новой свечи и при этом обратного сигнала нет ..Я поэтому привел кусок кода закрытия сделок .По коду вроде как должны дождаться нового сигнала 
Нужно после установки обнулять переменную "sig" потому что сигнал будет постоянен, если обнулить, тогда переменная примет снова значение после следующего пересечения, и после выполнения всех действий снова обнулить. Ну или ставить флаг, что если было пересечение вверх, то следующее должно быть вниз, и если вниз пересечения нет, то все сигналы игнорируются, пока не будет обратного пересечения
 

Здравствуйте.

Подскажите, что неправильно.

Значок должен устанавливаться если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора находится выше уровня 50, на периоде М5.

Почему-то значок ставится, даже если линия на М5 находится ниже заданного уровня 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
mila.com:

Здравствуйте.

Подскажите, что неправильно.

Значок должен устанавливаться если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора находится выше уровня 50, на периоде М5.

Почему-то значок ставится, даже если линия на М5 находится ниже заданного уровня 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Странный у вас цикл. Непривычный какой-то.

//+------------------------------------------------------------------+
   if(rates_total<xxx) return(0);         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if(limit>1) {                          // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total-1;                // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
      // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for(int i=limit; i>=0; i--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

Почему limit проверяем на больше 1. Например загрузилась история, и разница будет больше одного. Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
0 - пришел новый тик, новый бар формироваться не начал.
1 - пришел новый тик и начал формироваться новый бар

Покажите весь ваш индикатор - глянем что там не так.

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