程序库: Expert - 页 6

 
fxsaber:

EA 的作者绝不会主张在测试结果很差的情况下交易他的 EA。

他不会,但这些不是信号--EA 的销售与经纪中心无关。那么就有义务说明卖家在哪里得到这样的结果,这也算是 DC.... 的广告。

 
Aleksey Vyazmikin:

我不会煽动,但这些不是信号--顾问的销售与直流电无关。那么就有义务说明卖方是在哪里得到这样的结果的,这也算是 DC 的广告....。

也许,理论上的推理有时是好的。但我仍然对与本帖 相关的实践感兴趣。写在这个主题上是有原因的。

我建议不要再四面出击了。

 
fxsaber:

在市场上,我曾多次看到作者为每个角色附上其 TC 集文件。因此,买家也会使用它们。


我建议对市场 TC 使用以下逻辑

  • 添加一个输入参数
  • 如果用户指定了该文件夹,智能交易系统将自动从该文件夹中获取所有交易集,并运行相应版本。
  • 用户只需在启动智能交易系统时将套利文件放入该文件夹并指定该文件夹的路径(智能交易系统的作者可以一次性插入该路径)。
  • 如果用户操作失误,运行了两次,系统会自动阻止其运行。

这种方法也便于一键启动自己的 TS。

当然,该解决方案也可以在两个平台上通用。粗略地说,只需在任何智能交易系统的源代码中添加一行即可。


从现在起,我很可能就用这种方法启动 EA。如果有人发现这种方法有缺陷或需要改进,请告诉我。

在测试器中运行与在线运行将有所不同(毕竟文件夹不同),要将特定的 EA 副本与一组 EA 相匹配,需要做一些额外的工作。

而且,仅仅管理这群没有自己可视化的 EA 似乎也很困难。

此外,更改套组还需要重新启动所有 EA。


单个 MT 图表作为 "透明文件",存放在配置文件的 "硬文件夹 "中。这样,您就可以在每个文件中放入必要的信息,或轻松调出/替换必要的文件。您还可以通过更改配置文件切换到另一个 "硬文件夹"。非常方便。

我遇到过需要在所有 EA 中替换一个参数(例如风险)的情况。我是在模板文件中或通过一个特殊的主变量进行大规模替换的。如果能将其封装到一个方便的函数中,那就更方便了。

 
Andrey Khatimlianskii:

在测试器中运行与在线运行是不同的(文件夹不同),要将特定的 EA 副本与设置相匹配,您需要做一些额外的工作。

不会有任何区别。

那么,仅仅管理这群没有自己可视化的 EA 似乎很困难。

不会比现在更复杂。

另外,在更改设置的同时,还将重新启动所有顾问。

EA 将正常启动。只有在您愿意的情况下,您才可以指定一个文件夹中的数据集。

单个 MT 图表作为 "透明文件",存放在配置文件的 "硬文件夹 "中。这样您就可以在每个文件中放入必要的信息,或轻松取出/替换必要的文件。您还可以通过更改配置文件切换到另一个 "硬文件夹"。非常方便。

当然,您甚至可以在 MQL5\Profiles\Charts\.... 中自动读取/写入配置文件。但配置文件则完全不同。

我遇到过需要在所有 EA 中替换一个参数(例如风险)的情况。我是通过在模板文件中批量替换或通过一个特殊的主变量来实现的。如果能将其封装到一个方便的函数中,那就更方便了。

库中的示例中就有这样的功能。


不过,你应该区分通过重启方法更改输入参数和通过 F7 手动更改输入参数。前者是完全重启,后者则不是。有时您需要使用第二种方法。但这无法在 MQL 中实现。

 
fxsaber:

不会有任何区别。

怎么区别?选择你想要的那一套吗?


fxsaber:

不会比现在更复杂。

现在,每个运行中的 EA 都有自己的设置。

但是,如果运行 10 个智能交易系统的 "管理器 "中的某些系统手动更改了参数,那么 "管理器 "将如何运行?重启管理器后又会发生什么?会启动原来的设置吗?

 
Andrey Khatimlianskii:

如何选择?选择一个必要的集合?

MQL_TESTER。

现在,每个运行中的智能交易系统都有自己的参数集。

但是,如果手动更改了其中一些智能交易系统的参数,运行 10 个智能交易系统的 "管理器 "将如何运行?重启管理器后又会发生什么?还会启动原来的设置吗?

管理器不应该被使用。显然,只有通过代码我才能说明我的意思。感谢您的参与。

 
fxsaber:

MQL_TESTER。

你能给出一个稍微详细一点的答案吗?

当然可以确定启动在测试器中。但是无法访问 sets 文件夹(如果可以访问 kamon 文件夹则可以),而且读取这些 sets 也没有意义 - 您只需要测试其中一个。

测试后,您需要将其与运行中的智能交易系统进行匹配(例如,停止或更改某些参数)。要做到这一点,我是否需要进入包含集合的文件夹,找到必要的集合并对其进行编辑?


这样的话,在一个 EA 中对所有套组进行交易看起来更合理。可以选择一个或多个策略(套)。

 
Andrey Khatimlianskii:

能给我一个稍微详细一点的答复吗?

当然可以确定启动是在测试器中。但无法访问 sets 文件夹(如果是 kamon 则可以),而且读取这些 sets 也没有意义 - 您只需要测试其中一个。

测试后,您需要将其与运行中的智能交易系统进行匹配(例如,停止或更改某些参数)。要做到这一点,我是否需要进入包含设置的文件夹,找到所需的设置并对其进行编辑?

测试仪使用自定义选项文件。只需点击一下,就可以启动任何程序集。超级方便。

如果没有选项文件,就只能用老办法。也就是说,一切都不复杂。

那么用一个 EA 交易所有套利看起来更合理。您可以选择一个或多个策略(套)。

在 "测试器 "中始终有这样的选择--加载一套。

 
我建议在您的 EA 中建立这样的检查机制
// 防止错误启动 EA 克隆的跨平台示例。

#include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003

string GetExpertData( const ulong Chart = 0 ) 
{ 
  string Str = NULL; 

  MqlParam Parameters[]; 
  string Names[]; 

  if (EXPERT::Parameters(Chart, Parameters, Names)) 
  { 
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n"; 

    const int Amount = ::ArraySize(Names); 

    for (int i = 0; i < Amount; i++) 
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n"; 
  } 

  return(Str); 
} 

// 运行的是同一个顾问吗?
long IsRunning( void )
{ 
  long Res = 0;
  const string Str = GetExpertData();
  long Chart = ::ChartFirst(); 

  while (!Res && (Chart != -1)) 
    if ((Chart != ::ChartID()) && EXPERT::Is() && (Str == GetExpertData(Chart)))
      Res = Chart;
    else
      Chart = ::ChartNext(Chart); 

  return(Res); 
}

input int Range1 = 1;
input int Range2 = 1;

int OnInit()
{
  return(!MQLInfoInteger(MQL_TESTER) && IsRunning() &&
         (MessageBox("This EA is already running." +
                     GetExpertData() + "\nRun?", MQLInfoString(MQL_PROGRAM_NAME), MB_YESNO) == IDNO) ?
         INIT_FAILED : INIT_SUCCEEDED);
}
 

// MT4-advisor 显示运行的多空模式。

#include <fxsaber\Expert.mqh> //https://www.mql5.com/zh/code/19003

int GetLongShortFlag( const int Chart_ID = 0 )
{
  MqlParam Params[];
  string Names[];
  
  const int Res = EXPERT::Parameters(Chart_ID, Params, Names);
  
  return(((Res & 3) << 1) + (Res & 1));
}

string LongShortToString( const int Chart_ID = 0 )
{
  const int Flag = GetLongShortFlag(Chart_ID);
  string Str = NULL;
  
  if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY) && (bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Long & Short";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_LONGONLY))
    Str = "Only Long";
  else if ((bool)(Flag & SYMBOL_TRADE_MODE_SHORTONLY))
    Str = "Only Short";
    
  return(Str);
}

int OnInit()
{
  Alert(LongShortToString());
  
  return(INIT_FAILED);
}