Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1494

 

Подскажите, пожалуйста, с расчётами. 


Мне нужно, чтобы тейк был в 3 раза больше стопа. У меня вроде как получается, но что-то не то)). Робот торгует на золоте и индексах, а на валюте отказывается торговать (хотя всё считает правильно). 

Сначала я устанавливаю стоп на лой свечи 1:

//---Устанавливаем стоп
   double stoploss = iLow(_Symbol,PERIOD_CURRENT,1);
      Print("Цена стопа ", stoploss);

После чего считаю расстояния от ASK до стопа в пунктах, и присваиваю это значение перtменной points:

//---Опредеяем размер стопа в пунктах
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double low = iLow(_Symbol, 0, 1);
   double points = NormalizeDouble((ask - low) / _Point, _Digits);
      Print("Размер стопа ", points);

После этого рассчитываю стоп тоже в пунктах:

//---Считаем тейкпрофит
   double TP = NormalizeDouble(points * 3, _Digits);
   Print("Размер тейка ", TP);


Дальше у меня сделка открывается, и я к аску прибавляю ТР:

//---Открываем сделку на покупку
         if(Close > maHandle && Close > Open)
            {
               if(trade.Buy(Lot,_Symbol,SYMBOL_ASK,stoploss, ask + TP,"Это я, твой робот") == true)
                  {
                     Print("Открыта покупка");
                  }


И в тестере все расчёты верные, в 5-значных пунктах, стоп тоже стоит на Low1, размер стопа тоже верный по 5-знаку. Но с тейком что-то не то, от улетает не на 507 пунктов, а на 5070 пунктов



 

Здравствуйте, Сергей.

При вычислении стопа вы переходите от расстояния по цене к расстоянию в пунктах. Затем, умножая на 3, у вас получается расстояние до тейка тоже в пунктах. А потом вы к цене ask прибавляете количество пунктов.

Попробуйте не делить на размер одного пункта или затем не забывать снова на него умножать.

//---Устанавливаем стоп
   double stoploss = iLow(_Symbol,PERIOD_CURRENT,1);
      Print("Цена стопа ", stoploss);

//---Опредеяем размер стопа
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double low = iLow(_Symbol, 0, 1);
   double points = NormalizeDouble((ask - low) / _Point, _Digits);
   double points = NormalizeDouble((ask - low), _Digits);
      
//--- ...

Или так

//---Устанавливаем стоп
   double stoploss = iLow(_Symbol,PERIOD_CURRENT,1);
   Print("Цена стопа ", stoploss);

//---Опредеяем размер стопа в пунктах (это целое число)
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double low = iLow(_Symbol, 0, 1);
   int points = (ask - low) / _Point;
   Print("Размер стопа ", points);

//---Считаем тейкпрофит
   int TP = points * 3;
   Print("Размер тейка ", TP);

//---Открываем сделку на покупку
         if(Close > maHandle && Close > Open)
            {
               if(trade.Buy(Lot,_Symbol,SYMBOL_ASK,stoploss, NormalizeDouble(ask + TP * _Point, _Digits),"Это я, твой робот") == true)
                  {
                     Print("Открыта покупка");
                  }
 
Yuriy Bykov #:

Здравствуйте, Сергей.


Большое спасибо! Действительно, заплутал в ценах/пунктах. Сейчас попробую))

 
Теперь всё считается и ставится верно, но только на USDJPY, XAUUSD и любом индексе. А вот на валюте типа USDCAD, EURUSD сова не торгует и шлёт ошибку 4756. Значение я посмотрел в справке, но это ничего не дало)
 
Sergey Izhutov #:
Теперь всё считается и ставится верно, но только на USDJPY, XAUUSD и любом индексе. А вот на валюте типа USDCAD, EURUSD сова не торгует и шлёт ошибку 4756. Значение я посмотрел в справке, но это ничего не дало)

Сделайте как в прошлом сообщении: приведите код, который у вас открывает позиции. Тогда, возможно, получится что-то посоветовать. Принципиальной разницы между USDJPY и USDCAD быть не должно, скорее всего имеет место какая-то банальная ошибка.

 
Yuriy Bykov #:

Сделайте как в прошлом сообщении: 

Вот код

//---Открываем сделку на покупку
         if(Close > maHandle && Close > Open)
            {
               if(trade.Buy(Lot,_Symbol,SYMBOL_ASK,stoploss, ask + BuyTP,"Это я, твой робот") == true)
                  {
                     Print("Открыта покупка");
                  }
                 else
                     {
                         // Получение кода ошибки
                         int error_code = GetLastError();
                         Print("Ошибка отправки заявки: ", GetLastError());
                     }
                  
                     return;
            }
            
    //---Открываем сделку на продажу
         if(Close < maHandle && Close < Open)
            {
               if(trade.Sell(Lot,_Symbol,SYMBOL_ASK,stoploss,ask - SellTP,"Это я, твой робот") == true)
                  {
                     Print("Открыта продажа");
                  }
                 else
                     {
                         // Получение кода ошибки
                         int error_code = GetLastError();
                         Print("Ошибка отправки заявки: ", GetLastError());
                     }
                  
                     return;
            }
 

Скорее всего ошибка здесь:

if(Close > maHandle && Close > Open)

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

 
Yuriy Bykov #:

Скорее всего ошибка здесь:

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

Я тоже вечером так подумал, что надо его убрать. Я пока ещё с индюками не подружился. Я просто смутно помню, что в 4-ке просто писал, что Close > MA и там всё работало. Попробую закомментить хэндл и посмотреть итоги

 
Sergey Izhutov #:

Я тоже вечером так подумал, что надо его убрать. Я пока ещё с индюками не подружился. Я просто смутно помню, что в 4-ке просто писал, что Close > MA и там всё работало. Попробую закомментить хэндл и посмотреть итоги

Мне в своё время рекомендовали "подружиться" с отладчиком MetaEditor. После того, как более-мене познакомился с отладчиком, так после этого 99,9 % вопросов отпали сами собой. Ставите в наблюдение любые переменные и смотрите их значения, а потом сравниваете и понимаете, где в коде возникает проблема. Очень удобный инструмент. Рекомендую.

С уважением, Владимир.

 
MrBrooklin #:


Спасибо, посмотрю)

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