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

 
При модификацию Ордера , перед point= , нужно указать ордер о котором относится OrderGetDouble 
 
Ivan Ivanov:
При модификацию Ордера , перед point= , нужно указать ордер о котором относится OrderGetDouble 

Спасибо Ivan, я пробую, но у меня что то не получается.

Я не понимаю самой логики, как выбрать ордер для модификации по типу, а не тикету и потом обратится к его свойствам.

Так как в самой конструкции модификации ордера обязательным полем заполнения является ticket и нет типа ордера.

m_trade.OrderModify(ticket,Bid-(SHAG_s*_Point),Ask+((SLL_s-SHAG_s) *_Point),Ask-((TPP_s+SHAG_s)*_Point),0,0,0);

В моём случае есть два открытых ордера Buy_Stop и Sell_Stop. Последовательность их открытия может быть любой. 

Номер Тикета мне тут ни чем не помогает. 

В условии проверки, я могу узнать есть ли среди открытых ордеров - ордер Sell_Stop (например).

Но не могу понять, как мне обратится именно к этому ордеру Sell_Stop. что бы при вызове OrderModify

модифицировался именно Sell_Stop, а не то что случайно попало под тикет.

У меня ощущение, что синтаксис языка заставляет меня перебирать все ордера по тикету, только ради того, что бы я заполнил поле тикет в OrderModify.

Вот тут я запутался с модификацией ордеров. Потерял логику процесса...

 

Существует ли функция для присоединения к графику эксперта? Наподобие ChartIndicatorAdd().

Или как программно присоединить эксперт к заданному графику, если нет шаблона?

[Удален]  

Как перевести на mql5?

OP_LOTS = (((AccountBalance() * _LosPercent) / 100) / MarketInfo(Symbol(), MODE_TICKVALUE)) / (pp);
        OP_LOTS = MathRound(OP_LOTS / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
        OP_LOTS = MathMax(OP_LOTS, MarketInfo(Symbol(), MODE_MINLOT));
        OP_LOTS = MathMin(OP_LOTS, MarketInfo(Symbol(), MODE_MAXLOT));
 
Sprut112:

Как перевести на mql5?

double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double lotMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
Будет работать в обоих версиях.
 

Пожалуйста подскажите.

В справке есть пример: Общий алгоритм работы с ордерами.

  {
//--- получим общее количество ордеров
   int orders=OrdersTotal();
//--- пробежим по списку ордеров
   for(int i=0;i<orders;i++)
   {
   ResetLastError();
//--- скопируем в кэш ордер по его номеру в списке
   ulong ticket=OrderGetTicket(i);
   if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним
   {
   double price_open   =OrderGetDouble(ORDER_PRICE_OPEN);
   datetime time_setup =OrderGetInteger(ORDER_TIME_SETUP);
   string symbol       =OrderGetString(ORDER_SYMBOL);
   long magic_number   =OrderGetInteger(ORDER_MAGIC);
   if(magic_number    ==m_magic)
   {
//  обработаем ордер с заданным ORDER_MAGIC
   }
   PrintFormat("Ордер #%d по %s был выставлен %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
   }
   else  // вызов OrderGetTicket() завершился неудачно
   {
   PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());
   }
   }
  }

При компиляции возникает предупреждение на тип datetime  видимо конфликт преобразования из типа в тип. 

Не могу понять в чём проблема, по справке  ORDER_TIME_SETUP имеет тип datetime.

В чём проблема, и как её решить?

 
vladzeit:

Пожалуйста подскажите.

В справке есть пример: Общий алгоритм работы с ордерами.

При компиляции возникает предупреждение на тип datetime  видимо конфликт преобразования из типа в тип. 

Не могу понять в чём проблема, по справке  ORDER_TIME_SETUP имеет тип datetime.

В чём проблема, и как её решить?

datetime time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP);
//....
long magic_number   =(long)OrderGetInteger(ORDER_MAGIC);

Есть такое у OrderGetInteger нужно приводить к нужному типу, то-же самое и с INT

 
Konstantin Nikitin:

Есть такое у OrderGetInteger нужно приводить к нужному типу, то-же самое и с INT

Спасибо за пример.

Уточните ещё пожалуйста... правильно ли понял.

вот этим самым  =(datetime)OrderGetInteger. мы указываем OrderGetInteger принять явный тип datetime. ? 

Это правило касается всех функций, которые не имеют явного типа или не соответствуют типу присваиваемой переменной?  или это только частный случай?

Хочу понять, это правило или просто нужно запомнить как частный случай.  

 
vladzeit:

Спасибо за пример.

Уточните ещё пожалуйста... правильно ли понял.

вот этим самым  =(datetime)OrderGetInteger. мы указываем OrderGetInteger принять явный тип datetime. ? 

Это правило касается всех функций, которые не имеют явного типа или не соответствуют типу присваиваемой переменной?  или это только частный случай?

Хочу понять, это правило или просто нужно запомнить как частный случай.  

Это не частный случай. Если в переменную одного типа записываете значение другого типа, то компилятор вас об этом предупредит. А далее уже вам решать в какую переменную принимать какие данные.

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

Но вот если вы принимаете в int-переменную значение double, то тут уже вы сами должны понимать не будет ли потери данных при таком присвоении. Если вы точно знаете, что возвращаемое значение поместится в int, то указывайте явно int, если не знаете, то принимайте в double-переменную.

 
Artyom Trishkin:

Это не частный случай. Если в переменную одного типа записываете значение другого типа, то компилятор вас об этом предупредит. А далее уже вам решать в какую переменную принимать какие данные.

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

Но вот если вы принимаете в int-переменную значение double, то тут уже вы сами должны понимать не будет ли потери данных при таком присвоении. Если вы точно знаете, что возвращаемое значение поместится в int, то указывайте явно int, если не знаете, то принимайте в double-переменную.

Спасибо за подробный ответ. Усвоил.