Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 112

 
Николай Цепелев:

Здравствуйте. Написал в своем советнике расчет лота таким вот образом:

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);

Цель - при заданных рисках и стоп лоссе получать корректную величину лота вне зависимости от валюты счета и пары. risk задается как доля потерь при срабатывании стоп лосса. Стоп лосс SL в пунктах ( где пункт – минимальное возможное изменение цены пары). Собираюсь запускать данный советник на реальном счету. Но, есть сомнения. Если кто-нибудь, из более опытных программистов подскажет, какие могут возникнуть ошибки, буду очень благодарен.
Сначала тестер стратегий. Затем демо-счет. И только потом реал. Для проверки формулы напишите скрипт. Или просто на бумажке посчитайте. Взял баланс=100, риск=0,1  СЛ=100, Тик=0,00001  Лот=100*0,1 / (100*0,00001) = 10 / 0,001 = 10000   лот больше баланса? Может плечо учесть?
 
STARIJ:
Сначала тестер стратегий. Затем демо-счет. И только потом реал. Для проверки формулы напишите скрипт. Или просто на бумажке посчитайте. Взял баланс=100, риск=0,1  СЛ=100, Тик=0,00001  Лот=100*0,1 / (100*0,00001) = 10 / 0,001 = 10000   лот больше баланса? Может плечо учесть?

MarketInfo(Symbol(),MODE_TICKVALUE)) возвращает не размер минимального тика. В справке написано: 

Размер минимального изменения цены инструмента в валюте депозита.


Но на деле получается стоимость минимального изменения цены инструмента в валюте депозита 1 лота контракта.


В приведенном вами примере MarketInfo(Symbol(),MODE_TICKVALUE)) вернет 1. И тогда все получается верно. Проверял скриптом на реальных долларовых и рублевых счетах, все работает. Вот скрипт которым проверял:

 #property copyright "Copyright 2016, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property show_inputs

extern double risk=0.10;

extern int sl=1000;

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

   

   Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));

 

  }

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Вы правы. Проверка скриптом - быстрее и надежнее

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Ваш скрипт занимает на экране 19 см по высоте, мой 8,1 см - в два раза меньше. И цвет разный
 

Еще нужно точность в функции NormaliseDouble поставить в зависимость от минимального разрешенного лота. А то, если в функцию OrderSend передать лот к примеру 0,11, а инструмент торгуется только лотами кратными 0,1 - будет ошибка.

 

здравствуйте! Не могу понять почему не все сразу удаляются открытые сделки, тоесть советник удаляет некоторые, а на остальных несколько раз выдает ошибку orderdelete 4108, market order cannot be deleted, и только потом удаляет. хотя до начала цикла удаления они уже были открытыми.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

здравствуйте! Не могу понять почему не все сразу удаляются открытые сделки, тоесть советник удаляет некоторые, а на остальных несколько раз выдает ошибку orderdelete 4108, market order cannot be deleted, и только потом удаляет. хотя до начала цикла удаления они уже были открытыми.

Вот на этой странице объяснено, как удалять. У Вас 2 ошибки.

 
Добрый день. Прошу помощи. В НЕТЕ и на форуме все облазил. Тестирую советника в стандартном режиме, все ок... Ни ошибок ни предупреждений. Скачал тиковые данные, добавил. (Делал все как описано тут - "Как тестировать советники с качеством 99% — легко, бесплатно, легально" , и тут - "Как получить Качество Моделирования 99% в Тестере Стратегий Metatrader 4") При запуске постоянно ошибка array out of range in 'expert1.0.mq4' (69,25)... Понял что дело с массивом. А что делать не вдуплю. Но раз в стандартном режиме все ок... Плиз хелп
 
qroner:
При запуске постоянно ошибка array out of range in 'expert1.0.mq4' (69,25)... Понял что дело с массивом. А что делать не вдуплю.

Нужно смотреть код, или его кусок обрабатывающий данный массив.

Телепаты, сегодня отдыхают.

 
Konstantin Nikitin:

Нужно смотреть код, или его кусок обрабатывающий данный массив.

Телепаты, сегодня отдыхают.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
   ArrayInitialize(_Mas, 0);
   int Ticket=-1;
   for(int pos=OrdersTotal()-1; pos>=0; pos--){
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) &&  OrderSymbol()==_Simvol&&
         OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
            Ticket=OrderTicket();
            switch(OrderType()){
               case 0:{_Mas[0]++;_Mas[6]++;break;}
               case 1:{_Mas[1]++;_Mas[6]++;break;}
               case 2:{_Mas[2]++;_Mas[7]++;break;}
               case 3:{_Mas[3]++;_Mas[7]++;break;}
               case 4:{_Mas[4]++;_Mas[7]++;break;}
               case 5:{_Mas[5]++;_Mas[7]++;break;}
            }
         }
   }

}

Вот функция.

Я просто подумал что проблема не в коде так как в стандартном режиме ошибок нет.

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