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

 
Renat Akhtyamov:
Надеюсь, что в OnInit() переменной Percent присвоено какое либо значение?
Переменная Percent у меня пользователем задаётся. OnInit() я выкинул.
 
Michail_David:
Переменная Percent у меня пользователем задаётся. OnInit() я выкинул.
если Lots=0, ничего тестер не откроет
 
Renat Akhtyamov:
если Lots=0, ничего тестер не откроет
 У меня лоты рассчитываются относительно Percent. Тестер рассчитывает количество лотов, но сделок нет.

 Margin_Percent=AccountFreeMargin()*Percent/100; 

Lots=Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED);

      Lots_Volume=(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP));

if(Lots>Lots_Volume)
        {
         Lots=Lots_Volume;
        }
      else if(Lots<Lots_Volume)
         Lots=MathFloor(Lots);
      Print("Количество лотов : ",Lots);
      return;
 
Michail_David:
 У меня лоты рассчитываются относительно Percent. Тестер рассчитывает количество лотов, но сделок нет.

И всё-таки, где в коде задан Percent

и что выводит в журнал команда: Print("Количество лотов : ",Lots); ?

 
Renat Akhtyamov:

И всё-таки, где в коде задан Percent

и что выводит в журнал команда: Print("Количество лотов : ",Lots); ?

#property link      ""
#property version   "1.00"
#property strict
//--- input parameters
input int      Percent=50;
input int      Fast_EMA_Period=12;
input int      Slow_EMA_Period=25;
input int      Signal_Period=9;
input double   Step_PSAR=0.02;
input double   Maximum_PSAR=0.2;
input int      MAGICNUMBER=413;
static datetime New_Time;// Время текущего бара
double Margin_Percent;  //Используемые средства для открытия ордеров
double Lots;//Определение общего количества лотов
double Lots_Volume;
double MacdCurrent;//Параметры MACD основной линии текущего бара
double MacdPrevious1;//Параметры MACD основной линии предыдущего бара
double MacdPrevious2;//Параметры MACD основной линии со смещением на 2 бара
double StopLoss;//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара
double Previous_StopLoss;//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
double CurrentPSAR;//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   bool New_Bar=false;                    // Флаг нового бара
   int ticket,total,cnt;
//---------------------------------------------------------------------------
   New_Time=TimeCurrent();
   if(Time[0]==New_Time) // Сравниваем время
      New_Bar=true;      // Поймался новый бар
   else if(New_Bar==false) // Если бар не новый..
В пятой строчке Percent задаётся. Журнал выводит: "Количество лотов 90.0100000001". Может стоит NormalizeDouble() добавить?
 
Michail_David:
 В пятой строчке Percent задаётся. Журнал выводит: "Количество лотов 90.0100000001". Может стоит NormalizeDouble() добавить?

С лотом всё норм.

Ищите ошибку в логике открытия ордера.

Я обычно в таких случаях задаю явное условие, при котором ордер откроется

 
Renat Akhtyamov:

С лотом всё норм.

Ищите ошибку в логике открытия ордера.

Я обычно в таких случаях задаю явное условие, при котором ордер откроется

Приведите пожалуйста пример с явным условием. Если я правильно понимаю, в цикле должно быть одно условие для открытия. Правильно?
 
Michail_David:
Приведите пожалуйста пример с явным условием. Если я правильно понимаю, в цикле должно быть одно условие для открытия. Правильно?
Дайте команду на открытие ордера в начале кода, сразу после расчета лота и убедитесь что тестер работает исправно. Потом можно вернуть всё обратно.
 
Renat Akhtyamov:
Дайте команду на открытие ордера в начале кода, сразу после расчета лота и убедитесь что тестер работает исправно. Потом можно вернуть всё обратно.
Спасибо. Нашёл ошибку. После расчёта лотов у меня return; стоял. Из-за него лоты и не открывались
 
Michail_David:
В пятой строчке Percent задаётся. Журнал выводит: "Количество лотов 90.0100000001". Может стоит NormalizeDouble() добавить?
Обязательно. И не только лоты, но и остальные значения, которые передаются серверу. Лоты ещё полезно проверять на минимально и максимально допустимое на счёте значение, также на шаг изменения, были случаи, когда лот можно было менять с шагом 0.03, а значит 90.01 не прокатит, хоть занормализуйся.
Причина обращения: