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

 

Почему советник не может изменить цену отложенного ордера (sell stop) на более выгодную?


Вот функция которая определяет необходимость в передвижении цены открытия отложенного ордера

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... а это функция которая уже передвигает цену открытия отложенного ордера

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

Почему советник не может изменить цену отложенного ордера (sell stop) на более выгодную?


Вот функция которая определяет необходимость в передвижении цены открытия отложенного ордера


... а это функция которая уже передвигает цену открытия отложенного ордера

Ордер точно единственный? А модификация SLTP работает? если нет, нормализовать тейк и стоп надо бы

dist dist1 чему равно? Тут ордер надо задавать вместо позиции

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

Ордер точно единственный? А модификация SLTP работает? если нет, нормализовать тейк и стоп надо бы

dist dist1 чему равно? Тут ордер надо задавать вместо позиции

Спасибо Большое! Я не заметил это, казалось бы мелочь - а без неё не работает


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

 
Alexandr Sokolov:

Спасибо Большое! Я не заметил это, казалось бы мелочь - а без неё не работает


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

1. Пожалуйста 2. Хм, я в любом случае нормализую от греха. У вас цена получается из целого, умноженного на нормализованный дабл, в общем случае видимо получается тоже нормализованный дабл, но где-то я читал, что не всегда, пару раз в году может получится

что-то типа 1,13250000000000000000001

и тогда беда, в нужный момент когда самый мощный тренд не сработает, и ипотека снова здравствуйте)))

могу ошибаться, но я сам перестраховываюсь и нормализую всегда.

 
Aleksey Mavrin:

1. Пожалуйста 2. Хм, я в любом случае нормализую от греха. У вас цена получается из целого, умноженного на нормализованный дабл, в общем случае видимо получается тоже нормализованный дабл, но где-то я читал, что не всегда, пару раз в году может получится

что-то типа 1,13250000000000000000001

и тогда беда, в нужный момент когда самый мощный тренд не сработает, и ипотека снова здравствуйте)))

могу ошибаться, но я сам перестраховываюсь и нормализую всегда.

Математические операции с двумя нормализованными числами дают ненормализованный результат.

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

Norm(1.11111) + Norm(2.22222) = NoNorm(res)

Norm(1.11111 + 2.22222) = Norm(res)

 

@ Артём Тришкин

Я приложил код с этой темой.

Я нашел его код в базе кода. Возникли проблемы при изменении кода.

Входная часть имеет следующие записи:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif         Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif         Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif         Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Я хочу, чтобы этот параметр меняетсяв то время как программа работает: вход #ifdef __MQL4__ INT #else долго #endif Inp_element_2542795 = 400 // Сетка Шага, точки.  

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

Файлы:
Manage.mq5  859 kb
 
jaffer wilson :

@ Артём Тришкин

Я приложил код с этой темой.

Я нашел его код в базе кода. Возникли проблемы при изменении кода.

Входная часть имеет следующие записи:

Я хочу, чтобы этот параметр меняетсяв то время как программа работает: вход #ifdef __MQL4__ INT #else долго #endif Inp_element_2542795 = 400 // Сетка Шага, точки.  

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

Honestly, the question is not clear.

Do you want to change the input parameter Inp_element_2542795 every time you start the adviser?

Well, change it in the advisor settings when it starts. Or, if the adviser is already running, and you want to change this parameter, then press F7 - the advisor settings window will appear, and change this parameter in it.

 
Artyom Trishkin:

Honestly, the question is not clear.

Do you want to change the input parameter Inp_element_2542795 every time you start the adviser?

Well, change it in the advisor settings when it starts. Or, if the adviser is already running, and you want to change this parameter, then press F7 - the advisor settings window will appear, and change this parameter in it.

Let me clear. I guess the problem is translation. Actually, it is input value. and I am not getting where this value is getting used for the calculation. I do not want that every time 400 points should be used. I want to keep changing the values. I want to change the values to suitable calculation. Can you help me where I can make changes so that the value become dynamic during the program is running?

 
jaffer wilson :

Позвольте мне очистить. Я думаю, проблема в переводе. На самом деле, это входное значение. и я не понимаю, где это значение используется для расчета. Я не хочу, чтобы каждый раз использовалось 400 баллов. Я хочу продолжать менять значения. Я хочу изменить значения для подходящего расчета. Можете ли вы помочь мне, где я могу внести изменения, чтобы значение стало динамическим во время работы программы?

Create a new global variable. Set the value of the input parameter Inp_element_2542795 to it:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

and replace the entire entry of the string Inp_element_2542795 with this new variable g_element_2542795 using Ctrl + H

 

Здравствуйте!

Я только изучаю MQL5, прошу помощи.

Есть класс - https://www.mql5.com/ru/code/18721 (Влад. Карпутова). Спасибо Владимиру.

Рассчитывает профит (в пунктах, в валюте депозита, своп и комиссию). но в нем отсутствует фильтр по Магику.

Добавил фильтр по Магику (не уверен, что правильно, поэтому не хочу выкладывать с ошибками).

Получил результат

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

Результат по исходному классу и классу с фильтром по магику совпадают. Но, здесь есть один момент.

1.Почему сделки OUT имеют нулевой магик.

2.Если я неверно скорректировал класс (добавление магика) - прошу внести нужное изменение в исходный класс и выложить.

(и хорошо бы передавать классу символ, как параметр)

Благодарю за помощь.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...
Причина обращения: