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

 
Sergey Likho:

Подскажите, как рассчитать залог по сделке?


Пробовал два подхода 

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


И вот такой 

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



Первый дает странные результаты на EURJPY  если валюта депозита  USD. Нужно что то добавить в формулу? 

Второй тоже работает через раз, то верные значения дает, то какую-то ерунду (это зависит от депозита)  

второй вариант и есть правильный способ расчета залога, вернее Вы в переменной val получаете значение свободных средств после выставления ордера, а  в переменной FreeMarginCheck и есть сама величина залога

 
Igor Makanu:

второй вариант и есть правильный способ расчета залога, вернее Вы в переменной val получаете значение свободных средств после выставления ордера, а  в переменной FreeMarginCheck и есть сама величина залога

Уверены?

AccountFreeMarginCheck

Возвращает размер свободных средств, которые останутся после открытия указанного ордера по текущей цене на текущем счете.


Там еще есть нюанс:

Если открыты встречные сделки, т.е. на счете полный или неполный лок, то функция может давать неверные значения. 


 
Sergey Likho:

Уверены?

да, Вы правы, именно так: 

Возвращает размер свободных средствкоторые останутся после открытия указанного ордера по текущей цене на текущем счете.

насчет открытых сделок, нужно проверять, не помню, но скорее всего то что пишет терминал , должно сойтись с расчетными данными: суммарное количество лотов в каждом направлении сделок (БАЙ/СЕЛЛ) по всем символами потом вызываете для каждого символа

AccountFreeMarginCheck() передав ей лоты в каждом направлении и просуммировав эти результаты

сегодня рынок работает, проверить это не сложно, примерно так:

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Приветствую, подскажите что не так в функций? Функция осуществляет торговую паузу по времени, в параметрах начало паузы и конец паузы.
Функция почему то считывает время не с сервера брокера а с компьютера, несмотря на то что прописано TimeCurrent. И вообще сделки закрываются во время паузы, то есть функция не работает.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Приветствую, подскажите что не так в функций? Функция осуществляет торговую паузу по времени, в параметрах начало паузы и конец паузы.
Функция почему то считывает время не с сервера брокера а с компьютера, несмотря на то что прописано TimeCurrent. И вообще сделки закрываются во время паузы, то есть функция не работает.

распринтуйте TimeStart и StrToTime(TimeStart);

затем  распринтуйте TimeCurrent()

у Вас в  TimeStart не полный формат времени datetime, вернее время будет всегда как текущий день месяц и год при запуске советника, а потом оно  будет меняться?

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

ЗЫ: чтобы не путаться, можете  datetime представлять себе как int, чем он по сути и является и сравнивая  2 datetime, Вы сравниваете 2 int       

PSPS:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

наверное будет Ваш код работать, нужно так попробовать:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


я обычно так время считаю:

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

а потом сравниваю с настройками советника

 
Igor Makanu:

Благодарю, попробую разобраться, я просто начинающий), с вариантом && в место || еще не пробовал посмотреть онлайн, кстати в тестере этот код работает, время считывает с терминала, закрытия ордеров во время паузы нет, а в онлайн все иначе.

 

Здравствуйте! Терминал не запускается в тестере стратегий. Выставляю дату, например (2017,04,01 по 2018,05,29), нажимаю старт, он тут же выдаёт стоп. В журнале пишет следующее,

TestGenerator: no history data 'EURUSD30' from 2017.04.01 to 2018.05.29. И так на любом отрезке. Комп рабочий, я думал может быть оперативы мало. На домашнем компе тоже самое, перезагрузка не помогает, но постоит некоторое время, запускается. Советник скачал в маркете, триал. Если кто знает причину, подскажите пожалуйста?


 
danil77783:

Здравствуйте! Терминал не запускается в тестере стратегий. Выставляю дату, например (2017,04,01 по 2018,05,29), нажимаю старт, он тут же выдаёт стоп. В журнале пишет следующее,

TestGenerator: no history data 'EURUSD30' from 2017.04.01 to 2018.05.29. И так на любом отрезке. Комп рабочий, я думал может быть оперативы мало. На домашнем компе тоже самое, перезагрузка не помогает, но постоит некоторое время, запускается. Советник скачал в маркете, триал. Если кто знает причину, подскажите пожалуйста?


Вам вроде тестер и пишет, что нет исторических данных, F2 нажмите и загрузите историю, потом перегрузите терминал

 
danil77783:

Здравствуйте! Терминал не запускается в тестере стратегий. Выставляю дату, например (2017,04,01 по 2018,05,29), нажимаю старт, он тут же выдаёт стоп. В журнале пишет следующее,

TestGenerator: no history data 'EURUSD30' from 2017.04.01 to 2018.05.29. И так на любом отрезке. Комп рабочий, я думал может быть оперативы мало. На домашнем компе тоже самое, перезагрузка не помогает, но постоит некоторое время, запускается. Советник скачал в маркете, триал. Если кто знает причину, подскажите пожалуйста?


no history data не говорит ни о чем?

 
Igor Makanu:

Вам вроде тестер и пишет, что нет исторических данных, F2 нажмите и загрузите историю, потом перегрузите терминал

Спасибо! Попробую. А обновление терминала может влиять как то? То, что он обновлён или нет, хотя он сам об этом сообщит......

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