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

 
erotin:

Подскажите что не правильно в нормировке лота?

Неправильно ВСЁ. Прочтите статью "Какие проверки должен пройти советник..." Там есть готовая функция.

 

Готово, сделал пустой шаблон, подготовил всё необходимое для работы функции iCustom().

Прописал в фунцию интересующий меня индикатор iCrossAD.

Функция работает, индексы крайних стрелок Вверх и Вниз находит правильно, а вот значения цен, на которых эти стрелки были выставлены - НЕВЕРНО.

Код получился коротким, потому выложу его прямо сюда, файлы этого советника и индикатора приложу на всякий случай.

//+------------------------------------------------------------------+
//|                                             TestDoEasyPart08.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
input string               Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD";//----- "Внешние параметры индикатора iCrossAD" -----

input uint                 InpPeriodFind           = 400;                 // Bars for calculate
input uint                 InpUnheckedBars         = 2;                   // Unchecked bars
input uint                 InpPeriodIND            = 21;                  // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

uint            period_find = InpPeriodFind;       //Number bars for calculate

int            CrossAD;                           //Хэндл индикатора iCrossAD

double         Buf_Arrow_Sell[],                  //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,            //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
               
double         Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   ArraySetAsSeries(Buf_Arrow_Sell, true);
//---
   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete objects
   ObjectsDeleteAll(0,"",-1);
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int n=0;
   
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!MQLInfoInteger(MQL_TESTER))
      engine.OnTimer();
  }
Файлы:
iCrossAD.mq5  49 kb
 

Вот так выглядят записи в журнале на вкладке "Эксперты"

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:16.798 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0


 
Sergey Voytsekhovsky:

Вот так выглядят записи в журнале на вкладке "Эксперты"

2019.05.20 15:11:15.025 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

Вместо цен, на которых были созданы стрелки = -11211905.17483469



 

Sergey Voytsekhovsky:

...

Вместо цен, на которых были созданы стрелки = -11211905.17483469

Нажмите Ctrl+D, поводите мышкой вдоль линий индикатора и поглядите в окне данных какие значения имеют его буферы.

 
Artyom Trishkin:

Нажмите Ctrl+D, поводите мышкой вдоль линий индикатора и поглядите в окне данных какие значения имеют его буферы.

Если я Вас правильно понял, я искал в комнате кошку, которой там нет? Массив заполнялся не ценами, а значениями индикатора на тот момент? Спасибо, буду переосмысливать.

Еще вопрос на последок - компилятор выдает мне 2 предупреждения


sign mismatch Test_iCustom.mq5 79 20

sign mismatch Test_iCustom.mq5 92 20


Я не могу понять их причину, подскажите плиз. Что значит "знак несоответствия"(переводчик от Яндекса).???


 
Sergey Voytsekhovsky:

Если я Вас правильно понял, я искал в комнате кошку, которой там нет? Массив заполнялся не ценами, а значениями индикатора на тот момент? Спасибо, буду переосмысливать.

Еще вопрос на последок - компилятор выдает мне 2 предупреждения


sign mismatch Test_iCustom.mq5 79 20

sign mismatch Test_iCustom.mq5 92 20


Я не могу понять их причину, подскажите плиз. Что значит "знак несоответствия"(переводчик от Яндекса).???


Возможно, теряете знак числа. Покажите эти строки кода.

 
Artyom Trishkin:

Возможно, теряете знак числа. Покажите эти строки кода.

for(n=0; n<period_find; n++)
Вторая точно такая-же (циклы для поиска не нулевых значений в массивах "Стрелок").
 
Sergey Voytsekhovsky:
Вторая точно такая-же (циклы для поиска не нулевых значений в массивах "Стрелок").

Какие типы у переменных n и period_find ? Самое важное и не показали...

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

for(n=0; n<(int)period_find; n++)

А вообще - зачем объявляете переменную цикла на уровне обработчика OnTick() ?

Можно же так:

for(int n=0; n<(int)period_find; n++)

А из OnTick() убрать объявление n - ни к чему оно там.

 
Artyom Trishkin:

Какие типы у переменных n и period_find ? Самое важное и не показали...

uint            period_find = InpPeriodFind;       //Number bars for calculate
int             n=0;
Причина обращения: