初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1302

 
User_mt5:

弗拉基米尔-卡尔普托夫,还有我?)

我不能确定,但可以试试0.0。


新增: 在MQL5中似乎不能取消'INDICATOR_MINIMUM'和'INDICATOR_MAXIMUM'。

 
Vladimir Karputov:

我不能确定,但可以试试0.0。


新增: 似乎'INDICATOR_MINIMUM'和'INDICATOR_MAXIMUM'不能被MQL5取消。

唉......。

谢谢你的答复。

(其实关卡也有同样的问题;但通过设置关卡数量 来解决)。

 
User_mt5:

唉......。

谢谢你的答复。

(关卡的问题实际上是一样的;但通过设置关卡的数量 来解决)

实验,一切都会成功的。

 
User_mt5:


我比较了图表保存的属性(以'随机振荡器'指标为例)。



<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:

我比较了图表保存的属性(以'随机振荡器'指标为例)。

它显然是一个'bool'类型的属性,但从MQL5中无法访问这个属性。

是的,唉。

再次感谢)

 

有一个问题。使用该函数(见下文),我们可以通过历史上的头寸ID获得TakeProfit和StopLoss值(即当头寸已经平仓时),该函数在实时中起作用,但在策略测试器中,它无法找到TakeProfit和StopLoss,因为它没有看到设置止损的历史订单(重要的是,这些止损是在开仓后设置的)。

问题:我如何使用策略测试器根据票据找出平仓的TP/Loss?

#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);   
   }
}
 
大家好!
,我只是想对EA进行编程,我想先写一个统计 传播收集器。
,我的意思是,我希望它能做什么?在测试器中,一个EA启动并收集一定时间段内的tick历史数据,例如10天。
然后它在csv或xlsx文件中生成以下数据:
一段时间的平均点差:服务器上的00:00-09:00,09:00-18:00,18:00-00:00(所有10天),这段时间的最大点差,整个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