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

 
User_mt5:

Vladimir Karputov, а мне?)

Не могу точно сказать, но попробуйте 0,0


Добавлено: похоже отменить 'INDICATOR_MINIMUM' и 'INDICATOR_MAXIMUM' при помощи MQL5 нельзя.

 
Vladimir Karputov:

Не могу точно сказать, но попробуйте 0,0


Добавлено: похоже отменить 'INDICATOR_MINIMUM' и 'INDICATOR_MAXIMUM' при помощи MQL5 нельзя.

Увы..

Спасибо за ответ.

(с уровнями, вообще говоря, та же проблема; но решается установкой количества уровней)

 
User_mt5:

Увы..

Спасибо за ответ.

(с уровнями, вообще говоря, та же проблема; но решается установкой количества уровней)

Экспериментируйте и всё получится.

 
User_mt5:


Сравнил свойства, которые сохраняет график (на примере индикатора 'Stochastic Oscillator')



<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=1
scale_fix_min_val=0.000000
scale_fix_max=1
scale_fix_max_val=100.000000
expertmode=0
fixed_height=-1


<indicator>
name=Stochastic Oscillator
path=
apply=0
show_data=1
scale_inherit=0
scale_line=0
scale_line_percent=50
scale_line_value=0.000000
scale_fix_min=0
scale_fix_min_val=-10.500000
scale_fix_max=0
scale_fix_max_val=110.500000
expertmode=0
fixed_height=-1


Это явно свойство типа 'bool', но доступа к этому свойству из языка MQL5 нет.

 
Vladimir Karputov:

Сравнил свойства, которые сохраняет график (на примере индикатора 'Stochastic Oscillator')

Это явно свойство типа 'bool', но доступа к этому свойству из языка MQL5 нет.

Да, увы.

Спасибо ещё раз)

 

Есть проблема. Используя функцию (см. ниже) можно получить значения ТейкПрофита и СтопЛосса по ID позиции из истории (то есть когда позиция уже закрыта), эта функция работает в реал тайме, но в тестере стратегий почему то не может определить ТейкПрофит и СтопЛосс, так как не видит исторические ордера, которыми устанавливаются стопы (важно, что стопы устанавливаются после открытия позиции)

Вопрос, как в тестере стратегий, по тикету закрытой позиции узнать ТП/СЛ этой позиции?

#include <Trade\DealInfo.mqh>
#include <Trade\HistoryOrderInfo.mqh>

CDealInfo deal;
CHistoryOrderInfo ord;


void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){
   HistorySelectByPosition(ticket);
   tp=0;sl=0;
   double open=0, tp_=0, sl_=0;
   string symbol="";
   ENUM_DEAL_TYPE type=-1;
   for(int i=0; i<HistoryDealsTotal(); i++){
      if(!deal.SelectByIndex(i))continue;
      if(deal.Entry() ==DEAL_ENTRY_IN){
         open=deal.Price();
         symbol=deal.Symbol();
         type=deal.DealType();
         lot=deal.Volume();
         break;
      }
   }
   for(int i=0; i<HistoryOrdersTotal(); i++){
      if(!ord.SelectByIndex(i))continue;
      if(tp_==0)tp_=ord.TakeProfit();
      if(sl_==0)sl_=ord.StopLoss();
      if(tp_>0 && sl_>0)break;
   }
   if(symbol !=""){
      double coef=type==DEAL_TYPE_BUY ? 1:-1;
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      if(tp_>0 && coef*tp_>coef*open)
         tp=(int)(MathAbs(tp_-open)/point);
      if(sl_>0 && coef*sl_<coef*open)
         sl=(int)(MathAbs(sl_-open)/point);   
   }
}
 
Здравствуйте всем ! 
Я только пытаюсь в программирование советников, и хочу для начала написать статистический сборщик спредов. 
Ну то есть, что бы я хотел, чтобы он делал? В тестере запускается советник и собирает данные по истории тиков за определённое время, например за десять дней. 
Дальше выдаёт следующие данные в с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
Причина обращения: