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

 
Здравствуйте всем ! 
Я только пытаюсь в программирование советников, и хочу для начала написать статистический сборщик спредов. 
Ну то есть, что бы я хотел, чтобы он делал? В тестере запускается советник и собирает данные по истории тиков за определённое время, например за десять дней. 
Дальше выдаёт следующие данные в сsv или xlsx файл : 
Средний спред за промежуток времени: 00:00 - 09:00 по серверу, 09:00 - 18:00 , 18:00 - 00:00 (за все 10 дней), максимальный спред за это время, минимальный спред и усреднённый спред по валютной паре за весь период в десять дней. 
Мне очень надоело это собирать руками. 

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

Заранее спасибо всем ответившим и отнесшимся с пониманием к новичку. 
 

Всем привет. Может у кого-то есть готовый кусок кода. Есть 2 параметра, депозит=3000 и лот 0.01 то есть при депозите 3000 лот будет 0.01, теперь строго при удвоении то есть когда депо будет 6000 лот будет 0.02 при 9000 будет 0.03 как это сделать?

 
Pavel Komarovsky:

Всем привет. Может у кого-то есть готовый кусок кода. Есть 2 параметра, депозит=3000 и лот 0.01 то есть при депозите 3000 лот будет 0.01, теперь строго при удвоении то есть когда депо будет 6000 лот будет 0.02 при 9000 будет 0.03 как это сделать?

 Примерно так:

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double start_deposit=3000;
   double start_lot=0.01;
   double deposit=start_deposit;
   for(int i=0; i<10; i++)
     {
      
      double d=MathFloor(deposit/start_deposit);
      Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2));
      //---
      deposit=deposit+start_deposit*0.55;
     }
  }
//+------------------------------------------------------------------+

Результат:

2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    0#: ,deposit 3000.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    1#: ,deposit 4650.00, d 0.01
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    2#: ,deposit 6300.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    3#: ,deposit 7950.00, d 0.02
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    4#: ,deposit 9600.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    5#: ,deposit 11250.00, d 0.03
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    6#: ,deposit 12900.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    7#: ,deposit 14550.00, d 0.04
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    8#: ,deposit 16200.00, d 0.05
2021.05.04 09:03:15.246 Script 1 (EURUSD,H1)    9#: ,deposit 17850.00, d 0.05
Файлы:
Script_1.mq5  3 kb
 

Доброго Времени Суток,

Помогите пожалуйста найти ошибку... В скрипте копирую значения баров(BarsCount) с индикаторного буфера, потом обхожу значения в цикле, определяю сигнал и записываю для распечатки в Print(); Вроде все просто, да не тут то было... Получаю все сигналы как и хотел за исключением пересечения нулевой линии

CROSSOVER_OR_REVERSE

индикатора.  Может в скрипте так нельзя?  Код и скрин лога прикрепил...  Заранее благодарен!

//+------------------------------------------------------------------+
//|                                                B_O_P_Signals.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
  
input int       inpSmoothPeriod = 14;       // Result smoothing period
input enMaTypes inpSmoothMethod =  ma_sma;  // Result smoothing type
input double    inpLevelUp      =  0.2;     // Level up
input double    inpLevelDown    = -0.2;     // Level down
input int       BarsCount       = 100;

double Mid_line[1] = {0.0};
int handle=0;
double TREND_VAL[];

void OnStart()
  {
      handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown);
      
      CopyBuffer(handle,2,0,BarsCount,TREND_VAL);
      
      ArraySetAsSeries(TREND_VAL,true);
      
      string Signal ="";
      
        for (int i=ArraySize(TREND_VAL)-1; i>=0; i--)
        {
           int k=1;
            if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp)
            
               Signal = "TREND_UP";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp)
            
               Signal = "TREND_UP_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0])
            
               Signal ="CROSSOVER_OR_REVERSE_UP";
            
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown)
            
               Signal = "TREND_DN";
            else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown)
            
               Signal = "TREND_DN_ROLLBACK_OR_FLAT";
            else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0])
            
               Signal = "CROSSOVER_OR_REVERSE_DN";
            else Signal = "UNKNOWN_SIGNAL";
            
            Print(string(i),"_", Signal);
        }
      
   
  }
//+------------------------------------------------------------------+
Файлы:
Question.png  150 kb
 
afsmerinostra:

Доброго Времени Суток,

Помогите пожалуйста найти ошибку... В скрипте копирую значения баров(BarsCount) с индикаторного буфера, потом обхожу значения в цикле, определяю сигнал и записываю для распечатки в Print(); Вроде все просто, да не тут то было... Получаю все сигналы как и хотел за исключением пересечения нулевой линии

индикатора.  Может в скрипте так нельзя?  Код и скрин лога прикрепил...  Заранее благодарен!

Пересечение можно определить только сравнивая значения предыдущего индекса массива с нулём и значение текущего тоже с нулём. То-есть было выше нуля и стало ниже нуля. Или наоборот, было ниже и стало выше.

И внимательно прочтите в документации как работает if tlse if

Если в вашем коде выполнено одно из условий, то все следующие не обрабатываются.

 
Alexey Viktorov:

Пересечение можно определить только сравнивая значения предыдущего индекса массива с нулём и значение текущего тоже с нулём. То-есть было выше нуля и стало ниже нуля. Или наоборот, было ниже и стало выше.

И внимательно прочтите в документации как работает if tlse if

Если в вашем коде выполнено одно из условий, то все следующие не обрабатываются.

Насчет проверки уровня относительно ноля все верно было.  Перенес условия пересечения в начало кода стало все отрабатывать. Спасибо!
 
afsmerinostra:
Насчет проверки уровня относительно ноля все верно было.  Перенес условия пересечения в начало кода стало все отрабатывать. Спасибо!

Вообще вам надо почистить else, они нужны только в тех случаях когда условия взаимоисключающие, а пересечение это отдельные условия.

 
Всем привет!!!   Подскажите в чём ошибка?
//+------------------------------------------------------------------+
//|                                                 Signal_Line.mqh |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
class Signal_Line
  {
private:

public:
                     Signal_Line();
                    ~Signal_Line();
   bool              Signal_Short(double &Trend_Line_UP[][], int UP);
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Signal_Line::Signal_Line()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Signal_Line::~Signal_Line()
  {
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|     Метод проверки флагов событий цены относительно линий тренда                                                             |
//+------------------------------------------------------------------+
bool Signal_Line::Signal_Short(double &Trend_Line_UP[][], int UP)
  {
   if(Trend_Line_UP[UP][3]<iClose(_Symbol,0,0))
      return(true);
  }
//+------------------------------------------------------------------+
 

Написано же: а почему это Вы не соизволили вернуть значение?

bool Signal_Line::Signal_Short(double &Trend_Line_UP[][], int UP)
  {
   if(Trend_Line_UP[UP][3]<iClose(_Symbol,0,0))
      return(true);
//---
   return(false);
  }
 
Vladimir Karputov:

Написано же: а почему это Вы не соизволили вернуть значение?

Точно!!!   Во блин даю)))