OrderSend ошибка 130 - страница 2

 
gisip:

Явно, что ошибка в MT4, не работает функция OrderSend как надо если 5 знаков.

ага :))
 
gisip:

Среди них и сам MetaQuotes.

Короче везде где 5 знаков пишет 130 ошибку.

Если 4 знака то все работает нормально.

Явно, что ошибка в MT4, не работает функция OrderSend как надо если 5 знаков.


Для пятизнака - домнож значения стопов на 10 - все будет гут.
 
Roman.:

Для пятизнака - домнож значения стопов на 10 - все будет гут.

Тогда совсем ерунда получится!

Было: EURUSD Ask: 1.40764000 TP: 1.41154000 SL: 1.40354000

стало: EURUSD Ask: 1.40764000 TP: 14.11540000 SL: 14.03540000

 
gisip:

Тогда совсем ерунда получится!

Было: EURUSD Ask: 1.40764000 TP: 1.41154000 SL: 1.40354000

стало: EURUSD Ask: 1.40764000 TP: 14.11540000 SL: 14.03540000





:-))) Значения сл и тр при их расчетах в пунктах на 10 домножить... Допустим, на четырехзнаке: ТР = 60 пунктов, SL = 20 пунктов, то для уже для пятизнака,

например, для бай - необходимо эти "настоящие" пункты домножать на 10:

(Про слиппадже - тоже не забываем - домножаем на 10 - в этом примере он равен 20 пунктов для пятизнака (для четырехзнака = 2 ("настоящим" пунктам).

SL=Bid - StopLoss * 10 * Point;      // StopLoss   (цена)   
TP=Bid + TakeProfit * 10 * Point;      // TakeProfit (цена)
Ticket=OrderSend(Symbol(),0,Lots_New,Ask,20,SL,TP,"",MN);

 
gisip:

Тогда совсем ерунда получится!

Было: EURUSD Ask: 1.40764000 TP: 1.41154000 SL: 1.40354000

стало: EURUSD Ask: 1.40764000 TP: 14.11540000 SL: 14.03540000





А вообще неплохо бы в эксперте проводить вот такую общую проверку работы эксперта на пятизнаке, т.е. вверху в шапке Вы в любом случае указываете количество "настоящих" пунктов (как для четырехзнака), но в ф-ии инит () эксперта делаете проверку работы эксперта на пятизнаке и если это так (диджитс = 5 или 3), то значения сл и тр (в пунктах) домножаем на 10.

...
extern int StopLossPips = 20;    // Стоплосс в "настоящих" пипсах для четырехзнака
extern int TakeProfitPips = 60;  // Тейкпрофит в "настоящих" пипсах для четырехзнака



      

//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{
   ...
   
   // Пересчеты пунктов для пятизначного ДЦ
   
   if ((Digits == 3) || (Digits == 5))
   {
      SlipPips = SlipPips * 10;             // допустимое проскальзывание при открытии ордера 
      StopLossPips = StopLossPips * 10;
      TakeProfitPips = TakeProfitPips * 10;
      
    }   
   
   return (0);
}
 
gisip:

Тогда совсем ерунда получится!

Было: EURUSD Ask: 1.40764000 TP: 1.41154000 SL: 1.40354000

стало: EURUSD Ask: 1.40764000 TP: 14.11540000 SL: 14.03540000





Кроме вышесказанного не забывайте про нормализацию значений СЛ и ТР до точности "диджитс" при открытии позиций, например,

TP = NormalizeDouble ((PRICE + Mul1*iATR(Symbol(), 0, ATRPeriod_3, 1)), Digits) ;      // TakeProfit (цена)
 
Roman.:


А вообще неплохо бы в эксперте проводить вот такую общую проверку работы эксперта на пятизнаке, т.е. вверху в шапке Вы в любом случае указываете количество "настоящих" пунктов (как для четырехзнака), но в ф-ии инит () эксперта делаете проверку работы эксперта на пятизнаке и если это так (диджитс = 5 или 3), то значения сл и тр (в пунктах) домножаем на 10.

ИМХО: лучше ввести свою переменную - размер пункта, поскольку, к сожалению, переменная Point в МКЛ этому смыслу не отвечает. Переход некоторыми диллингами на точность котирования в одну десятую пункта почему-то выхолостил смысл переменной: Размером пункта считается величина изменения цены, которая приводит к изменению стоимости стандартного лота (100К на FOREX) на 10 единиц базовой валюты. Для евры (EURUSD), например, это будет 0.0001 - то есть изменение в 4-м знаке...... К сожалению, производители МТ об этом напрочь забыли.

Я ввел свою переменную stdPoint ; функцию можно определить, например, так:

double GetStdPointSize(string SMBL)
{
    // ********************** FOREX ********************** 
    if (StringFind(SMBL, "JPY") != -1) return(0.01);
    if (StringFind(SMBL, "HUF") != -1) return(0.01);
    if (StringFind(SMBL, "XAG") != -1) return(0.01);
    if (StringFind(SMBL, "XAU") != -1) return(0.1);
    if (StringFind(SMBL, "USD") != -1) return(0.0001);
    // ********************** CFD ********************** 
    return(0.01);
}

Удачи.

 
Roman.:


А вообще неплохо бы в эксперте проводить вот такую общую проверку работы эксперта на пятизнаке, т.е. вверху в шапке Вы в любом случае указываете количество "настоящих" пунктов (как для четырехзнака), но в ф-ии инит () эксперта делаете проверку работы эксперта на пятизнаке и если это так (диджитс = 5 или 3), то значения сл и тр (в пунктах) домножаем на 10.

я ещё так делаю, для уменьшения вычислений в теле программы.

extern int StopLossPips = 20;    // Стоплосс в "настоящих" пипсах для четырехзнака
extern int TakeProfitPips = 60;  // Тейкпрофит в "настоящих" пипсах для четырехзнака



      

//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{
   ...
   
   // Пересчеты пунктов для пятизначного ДЦ
   
      SlipPips = SlipPips * Point;             // допустимое проскальзывание при открытии ордера 
      StopLossPips = StopLossPips * Point;
      TakeProfitPips = TakeProfitPips * Point;
   if ((Digits == 3) || (Digits == 5))
   {
      SlipPips = SlipPips * 10;             // допустимое проскальзывание при открытии ордера 
      StopLossPips = StopLossPips * 10;
      TakeProfitPips = TakeProfitPips * 10;
      
    }   
   
   return (0);
}
 

sanyooooook:

я ещё так делаю, для уменьшения вычислений в теле программы.

Вы уверены что надо так:

SlipPips = SlipPips * Point;// допустимое проскальзывание при открытии ордера 

?

В справке указано иначе: https://book.mql4.com/ru/trading/ordersend

...

slippage - обычно это значение указывают в размере от 0 до 3 пунктов. Укажем значение 2;

...

OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);

Правда поставили 3, но не это главное. Нет такого чтобы было 3*Point.

Может в хелпе ошибка?

 
gisip:

Вы уверены что надо так:

?

В справке указано иначе: https://book.mql4.com/ru/trading/ordersend

...

slippage - обычно это значение указывают в размере от 0 до 3 пунктов. Укажем значение 2;

...

Правда поставили 3, но не это главное. Нет такого чтобы было 3*Point.

Может в хелпе ошибка?


Для пятизнака ставь 30 пп, для четырех - 3... Сам то посмотри для начала на демо... Все работает исправно.
Причина обращения: