Вопрос к знатокам - страница 2

 

Так никто и не знает, - как работает встроенный в мт4 советник Moving Average ?

При вот таком условии (см. в коде ф-и открытия и закрытия поз)

if(iVolume("USDJPY_FX",60,0)>1) return;

По всем тикам, или по Ценам открытия ?

И  если по Ценам открытия, то в  каком случае (теоретически, хотя бы) при работе на тф=н1 этот советник может открыть/закрыть позицию в 16:43, т.е. в середине часа ?

 
rid >>:

Так никто и не знает, - как работает встроенный в мт4 советник Moving Average ?

При вот таком условии (см. в коде ф-и открытия и закрытия поз)

По всем тикам, или по Ценам открытия ?

И если по Ценам открытия, то в каком случае (теоретически, хотя бы) при работе на тф=н1 этот советник может открыть/закрыть позицию в 16:43, т.е. в середине часа ?

В случае ошибки функция iVolume() возвращает 0.

 
Swan >>:

В случае ошибки функция iVolume() возвращает 0.

И о чем это говорит ? Мне непонятно. 

Ведь не может же функция сотни раз подряд возвращать ошибку после открытия нового бара..

Ну с первым тиком, со вторым, с третьим. ....

Но вряд ли больше. Мне вообще непонятно, зачем во встроенном в мт4 советнике Moving Average введено в условие открытия/закрытия позиций выражение:

  if(Volume[0]>1) return;

Ну зачем ?

void CheckForClose()  {//ф-я закрытия  позиций
   double ma;
   if(Volume[0]>1) return;//если есть тики

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//----------------------      
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
  }
 

if(Volume[0]>1) return;//если не первый тик в баре, то ждем следующего.

достаточно одной ошибки в середине бара.

Нормально должно работать только в тестере. наверное))

 
Благодарю. Вроде, понятно.
 
rid >>:

if(Volume[0]>1) return;

Ну зачем ?

Древний способ контроля баров. Работает исключительно в тестере.

 

Теперь понятно, почему мой мультивалютный советник на конкурсном сервере открывает не более 10-15 процентов сделок. От общего  числа сигналов на открытие.

А вот там, где мой приятель вместо if(Volume[0]>1) return;

вставил любимые всеми нами "строки" - 

if(Time[0] == prevtime) return(0);//ждём появления нового бара
  prevtime = Time[0];//если появился новый бар, включаемся
Там всё работает нормально !

 
double spv=0;
double afm=AccountFreeMargin();
double ttt0=0;
total=OrdersTotal();
    if(total > 0)
     { 
       for(cnt = 0; cnt < total; cnt++)
       {
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          //---- проверяем есть ли открытые позиции
          if(OrderMagicNumber()<100)
          {    
           if(OrderLots()>0)
           ttt0=ttt0+OrderLots();
          }
       }
     } 
     
  if(ttt0==0 && AccountFreeMargin()>10000)  //  если откр поз нет и сумма депозита> числа n
  {
   afm=5000;    // оставляемая сумма на депозите
   spv=AccountFreeMargin()-5000;     // сумма перевода на другой счет
  }
  
  //----> далее AccountFreeMargin() должно быть равно afm       
Подскажите как в поцессе работы советника имитировать ситуацию частичного снятия денег и перевода их на другой счет
 

Добрый день. Вот советник из Code Base    https://www.mql5.com/ru/code/8210

//---------

Не пойму в чем дело. При работе советника журнал  начинает оч. скоро печатать ошибку открытия 130 и работа заклинивает!

До стопаута ещё далеко.

И  это при том, что стопы в советнике равны нулю. Шаг установки ордеров соответствует и даже многократно превышает допустимый стопуровень.

Код оч. простой и легко читаемый.

extern double  MinProfit=50;
extern int     Step=15;
extern double  FirstLot=0.1;
extern double  IncLot=0;
extern int     Magic = 2008;
double gLotSell=0;
double gLotBuy=0;
double LSP,LBP;
//-------------------------------------
int init(){Comment("Waddah Attar Win");
  GlobalVariableSet("OldBalance",AccountBalance());
  return(0);}
//-------------------------------------
int deinit(){ Comment(""); return(0);}
//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
int start()
{
  double i;  double sl,p;
//---------------------------------------
 if (AccountEquity()>=GlobalVariableGet("OldBalance")+MinProfit)
  {//если прибыль позиций превысила заданное 
//значение, то удаляем ордера и закрываем позиции
    DeletePendingOrders(Magic);
    CloseOrders(Magic);
    GlobalVariableSet("OldBalance",0);
  }

  GlobalVariableSet("OldBalance",AccountBalance());
//-----------------------------------------------------
  if (MyOrdersTotal(Magic)==0)//если нет ордеров
  {//изначальная установка ордеров
OrderSend(Symbol(),OP_BUYLIMIT,FirstLot,Ask-Step*Point,3,0,0,"",Magic,0,Green);
OrderSend(Symbol(),OP_SELLLIMIT,FirstLot,Bid+Step*Point,3,0,0,"",Magic,0,Red);
  }
  LSP=GetLastSellPrice(Magic);//ЦЕНА установки посл. селл ордера
  LBP=GetLastBuyPrice(Magic); //ЦЕНА установки посл. бай ордера
//--------установка дополнит. ордеров------------  
  if((LSP-Bid)<=5*Point)
  { OrderSend(Symbol(),OP_SELLLIMIT,gLotSell+IncLot,
                         LSP+Step*Point,3,0,0,"",Magic,0,Red);}

  if((Ask-LBP)<=5*Point)
  { OrderSend(Symbol(),OP_BUYLIMIT,gLotBuy+IncLot,
                         LBP-Step*Point,3,0,0,"",Magic,0,Red);}
//------------------------------------------------
  return(0);
}


//ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
//============= пользовательские функции =============
int DeletePendingOrders(int Magic)//ф-я удаления ордеров
{  int total  = OrdersTotal();  
  for (int cnt = total-1 ; cnt >= 0 ; cnt--)
  {    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() 
            && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
    {      OrderDelete(OrderTicket());
    }  }  return(0);}
//--------------------------------------------------------
int CloseOrders(int Magic) {//ф-я закрытия позиций
  int total  = OrdersTotal();  
  for (int cnt = total-1 ; cnt >= 0 ; cnt--)
  {    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol()) {
      if (OrderType()==OP_BUY)
      { OrderClose(OrderTicket(),OrderLots(),Bid,3);  }      
      if (OrderType()==OP_SELL)
      { OrderClose(OrderTicket(),OrderLots(),Ask,3);  }
    }  }  return(0);}
//----------------------------------------------------
int MyOrdersTotal(int Magic) {//ф-я опр-я наличия ордеров
  int c=0;  int total  = OrdersTotal();
  for (int cnt = 0 ; cnt < total ; cnt++)  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
    {      c++;    }   }  return(c);}
//----------------------------------------------------
double GetLastBuyPrice(int Magic) {//цена открытия бай
  int total=OrdersTotal()-1;
  for (int cnt = total ; cnt >=0 ; cnt--)  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol()
            && (OrderType()==OP_BUYLIMIT || Outputted()==OP_BUY))
    { gLotBuy=OrderLots();      return(OrderOpenPrice());
      break;  } }  return(0);}
//------------------------------------------------------
double GetLastSellPrice(int Magic) {//цена открытия селл
  int total=OrdersTotal()-1;
  for (int cnt = total ; cnt >=0 ; cnt--)  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == Magic && OrderSymbol()==Symbol() 
           && (OrderType()==OP_SELLLIMIT ||OrderType()==OP_SELL))
    {gLotSell=OrderLots();
      return(OrderOpenPrice());
      break;    }  }  return(100000);}

Причем, ошибка обычно начинает появляться тогда, когда цена делает ГЭП или с появлением длинной свечи, - см. рисунок  ниже.

Хотелось бы понять, в чем причина ошибки. Пож. подскажите.


 

Возможно ошибка сидит тут

  LSP=GetLastSellPrice(Magic);//ЦЕНА установки посл. селл ордера
  LBP=GetLastBuyPrice(Magic); //ЦЕНА установки посл. бай ордера
//--------установка дополнит. ордеров------------  
  if((LSP-Bid)<=5*Point)
  { OrderSend(Symbol(),OP_SELLLIMIT,gLotSell+IncLot,
                         LSP+Step*Point,3,0,0,"",Magic,0,Red);}

  if((Ask-LBP)<=5*Point)
  { OrderSend(Symbol(),OP_BUYLIMIT,gLotBuy+IncLot,
                         LBP-Step*Point,3,0,0,"",Magic,0,Red);}

Так как есть открытые позиции, то должны открываться только дополнительные. А контроля на допустимую цену.

Хотя почему тогда 130 ошибка