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

 

Gumko:

Gumko: И долго этого ждать, когда задача первая появится?...

Стоит уже 2 день  

Я ждал дней 8-10, потом плюнул и отключил.
 
Мне интересно на сколько максимально загружен процессор при фоновой работе программы Tester?
 

Привет всем.

Модификация и проблем.

Внешная функция:

bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "";
   StringConcatenate(word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  ",
                     symbol," ============ >>>");
   Print(word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      Print("Modify error =", GetLastError());
      return(false);
     }
   return(true);
  }  

Но так не получается.

Как сделат?

Спосибо :) 

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
mario065: Но так не получается. Как сделать? Спасибо :)   

 Попробуйте так:

MqlTradeRequest request={0};
MqlTradeResult  result ={0};
 
Yedelkin:

 Попробуйте так:

 

Yedelkin,

Спосибо Вам,не получилос.

Я проверил правилно ли считает для старт вызова функции.

Вот как сделал:

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0){
  start_buy = Ask - Open;Print("start_buy=",start_buy);
  start_sel = Open - Bid;Print("start_sel=",start_sel);
  }

Удивление в логе:

MR 0 Core 1 10:21:49 2012.10.01 01:12:42   deal #2 sell 0.10 EURUSD at 1.28146 done (based on order #2)
GH 0 Core 1 10:21:49 2012.10.01 01:12:42   deal performed [#2 sell 0.10 EURUSD at 1.28146]
NI 0 Core 1 10:21:49 2012.10.01 01:12:42   order performed sell 0.10 at 1.28146 [#2 sell 0.10 EURUSD at 1.28146 (0.00000)]
OF 0 Core 1 10:21:49 2012.10.01 01:12:43   start_buy=0.0001299999999999635
DR 0 Core 1 10:21:49 2012.10.01 01:12:43   start_sel=5.000000000010552e-005
LE 0 Core 1 10:21:49 2012.10.01 01:12:43   start_buy=0.0001099999999998325
EN 0 Core 1 10:21:49 2012.10.01 01:12:43   start_sel=7.00000000000145e-005

Конечно интересует толко села-откуда такие числа?

Вроде правилно написал функция-как показано:

SL & TP Modification

Торговый приказ на модификацию уровней StopLoss и/или TakeProfit. Требуется указание 4 полей:

  • action
  • symbol
  • sl
  • tp
  •  
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
mario065: Спасибо Вам, не получилось.

 Так а что именно "не получилось"?

mario065: Я проверил, правильно ли считает для старт вызова функции. Вот как сделал:

 Вставляйте код правильно (Ctrl+Alt+M):

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0)
    {
     start_buy = Ask - Open;Print("start_buy=",start_buy);
     start_sel = Open - Bid;Print("start_sel=",start_sel);
    }

Здесь нормализацию надо использовать в другой последовательности.  

1. Так как значения типа SymbolInfoDouble(Currency,SYMBOL_BID) приходят с сервера, то они уже считаются нормализованными. И второй раз нормализовывать их - не обязательно. Т.е. можно просто написать: 

double Bid  = SymbolInfoDouble(Currency,SYMBOL_BID);

 2. А вот после любой арифметической  операции нормализация пропадает, поэтому в случае необходимости получения нормализованного числа надо написать так:

start_buy = NormalizeDouble(Ask - Open,_Digits);

Над остальным пока думаю. 

 
mario065: Удивление в логе:

DR 0 Core 1 10:21:49 2012.10.01 01:12:43   start_sel=5.000000000010552e-005
EN 0 Core 1 10:21:49 2012.10.01 01:12:43   start_sel=7.00000000000145e-005

Конечно, интересует только села - откуда такие числа? 

 7.00000000000145e-005  - это всего лишь один из способов записи значения вещественного числа. По-моему, называется "научный". Подробнее см. "Справочник MQL5 / Основы языка / Типы данных / Вещественные типы (double, float)".
 
Yedelkin:
 7.00000000000145e-005  - это всего лишь один из способов записи значения вещественного числа. По-моему, называется "научный". Подробнее см. "Справочник MQL5 / Основы языка / Типы данных / Вещественные типы (double, float)".

Yedelkin,

Спосибо Вам что взялис за решение проблема.

Вот и код.Функции для откритие позиции написани от Николай Коситцин.Nikolay Kositsin.

Файлы:
MTB_E.mq5  9 kb
 
Подскажите как и где указать в советнике принадлежность МА к окну №2.
К примеру к MFI добавил МА и этот МА хочу прописать в советнике. Не знаю как и где.

Благодарю за ответ отвечавшему )
 
mario065: Вот и код. Функции для открытия позиции написаны от Николай Коситцин. Nikolay Kositsin.  

1. Я бы сказал так: использовать чужой код следует с большой долей осторожности. Потому что чужой код - это и чужие ошибки.

2. Вот здесь (https://www.mql5.com/ru/forum/6343/page64#comment_357008) я предложил Вам попробовать правильно обнулить переменные перед их использованием. Но в Вашем коде это предложение пока не реализовано. Более, того, в коде присутствуют конструкции вот такого типа:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)
  {
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = ...
   request.symbol       = ...
   request.sl           = ...
   request.tp           = ...
   ...
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      ...
     }
   ZeroMemory(request);
   ZeroMemory(result);
   return(true);
  }

Понимаете, в этой конструкции переменные  request и result обнуляются не перед использованием, а после использования. Более того, после обнуления этих локальных переменных функция прекращает свою работу, то есть само такое обнуление является бессмысленным. Иными словами, такая конструкция является наглядным примером того, как не надо проводить обнуление переменных типа MqlTradeRequest и MqlTradeResult. Поэтому, если есть желание, попробуйте всё-таки обнулить переменные правильно. Если что-то не получится, подробно опишите, что именно "не работает".

3. В Стандартной библиотеке есть  торговый класс "Справочник MQL5 / Стандартная библиотека / Торговые классы / CTrade". Попробуйте разобраться, как применять его на практике. На начальном этапе погружения в язык этот класс может оказаться вполне достаточным. Например, в этом классе есть вот такой метод: "Справочник MQL5 / Стандартная библиотека / Торговые классы / 2CTrade / PositionModify". Реализован он так:

//+------------------------------------------------------------------+
//| Modify specified opened position                                 |
//+------------------------------------------------------------------+
bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

В нём строчка  'ClearStructures();'  как раз и обнуляет переменную m_request перед её использованием.

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