程序库: MT4Orders - 页 37

 

关于交易、自动交易系统和测试交易策略的论坛

专家顾问:Equity Tral

fxsaber, 2019.04.30 22:57

在 MT5 下转换此 EA

#define  MT4_TICKET_TYPE // 命令发送(OrderSend)和订单票据(OrderTicket)必须返回与 MT4 相同类型的值 - int。
#include <KimIVToMT5.mqh> //https://c.mql5.com/3/263/KimIVToMT5.mqh

#include "ind4to5.mqh" //https://c.mql5.com/3/277/ind4to5.mqh

bool ObjectSetText( const string name, const string text,
                    const int font_size = 0, const string font_name = NULL, const color Color = clrNONE )
{
  return(ObjectSetString(0, name, OBJPROP_TEXT, text) &&
         ((font_name == NULL) || ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_size)) &&
         ((font_name == NULL) || ObjectSetString(0, name, OBJPROP_FONT, font_name)) &&
         ((Color == clrNONE) || ObjectSetInteger(0, name, OBJPROP_COLOR, Color)));
}

void OnInit() { init(); }
void OnDeinit( const int ) { deinit(); }
void OnTick() { start(); }

#include "Equity_Tral.mq4" //https://www.mql5.com/zh/code/12354
 

我正在研究自学指标转换的特殊性。下面是另外三个指标。

#define  MT4_TICKET_TYPE // 命令发送(OrderSend)和订单票据(OrderTicket)必须返回与 MT4 相同类型的值 - int。
#include <KimIVToMT5.mqh> //https://c.mql5.com/3/263/KimIVToMT5.mqh

#define  MT4_OLD_EVENT_HANDLERS
#include "ind4to5.mqh" //https://c.mql5.com/3/277/ind4to5.mqh

bool ObjectSetText( const string name, const string text,
                    const int font_size = 0, const string font_name = NULL, const color Color = clrNONE )
{
  return(ObjectSetString(0, name, OBJPROP_TEXT, text) &&
         ((font_name == NULL) || ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_size)) &&
         ((font_name == NULL) || ObjectSetString(0, name, OBJPROP_FONT, font_name)) &&
         ((Color == clrNONE) || ObjectSetInteger(0, name, OBJPROP_COLOR, Color)));
}

int WindowFind( const string ) { return(ChartWindowFind()); }
int Digits( void ) { return(_Digits); }
string StringTrimRight2( string Str ) { StringTrimRight(Str); return(Str); }
string StringTrimLeft2( string Str )  { StringTrimLeft(Str); return(Str); }
string ObjectDescription( const string name ) { return(ObjectGetString(0, name, OBJPROP_TEXT)); }

#define CORNER_LEFT_LOWER  2
#define CORNER_LEFT_UPPER  0
#define CORNER_RIGHT_LOWER 3
#define CORNER_RIGHT_UPPER 1
#define  CORNER(A) ((A) ? ((A) + 1) % 3 + 1 : 0)

bool ObjectSet2( const string name, const ENUM_OBJECT_PROPERTY_INTEGER property, const long value )
{
  return((property != OBJPROP_CORNER) ? ObjectSetInteger(0, name, property, value)
                                      : ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER(value)) && 
                                        ObjectSetInteger(0, name, OBJPROP_ANCHOR, CORNER(value) << 1));
}

bool ObjectSet2( const string name, const ENUM_OBJECT_PROPERTY_DOUBLE property, const double value )
{  
  return(ObjectSetDouble(0, name, property, value));
}

#undef  CORNER

template <typename T>
bool ObjectCreate2(const string name, const T type, const int subwindow, const datetime time1, const double price1,
                                                                        const datetime time2 = NULL, const double price2 = NULL)
{
  return(ObjectCreate(0, name, (ENUM_OBJECT)type, subwindow, time1, price1, time2, price2));
};

template <typename T>
bool ObjectCreate2(const long chart_id, const string name, const T type, const int subwindow,
                   const datetime time1, const double price1, const datetime time2 = NULL, const double price2 = NULL)
{
  return(ObjectCreate(chart_id, name, (ENUM_OBJECT)type, subwindow, time1, price1, time2, price2));
};

#define  TRUE  true
#define  FALSE false

#define StringTrimRight   StringTrimRight2
#define StringTrimLeft    StringTrimLeft2
#define  ObjectSet ObjectSet2
#define ObjectCreate ObjectCreate2
#define StringConcatenate StringConcatenate2

string StringConcatenate2( const string Str1, const int Str2 ) { return(Str1 + (string)Str2); }
string StringConcatenate2( const double Str1, const string Str2, const string Str3 ) { return((string)Str1 + Str2 + Str3); }
string StringConcatenate2( const string Str1, const string Str2, const string Str3 = "", 
                           const string Str4 = "", const string Str5 = "", const string Str6 = "", const string Str7 = "" )
{
  return(Str1 + Str2 + Str3 + Str4 + Str5 + Str6 + Str7);
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const string Str4, const string Str5, const double Str6,
                           const string Str7,  const string Str8, const string Str9, const double Str10 )
{
  return(Str1 + (string)Str2 + Str3 + Str4 + Str5 + (string)Str6 + Str7 + Str8 + Str9 + (string)Str10);  
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const string Str4, const string Str5, const double Str6,
                           const string Str7,  const string Str8, const string Str9,
                           const double Str10,  const string Str11, const double Str12 )
{
  return(Str1 + (string)Str2 + Str3 + Str4 + Str5 + (string)Str6 + Str7 + Str8 + Str9 + (string)Str10 + Str11 + (string)Str12);  
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const double Str4, const string Str5, const double Str6 )
{
  return(Str1 + (string)Str2 + Str3 + (string)Str4 + Str5 + (string)Str6);
}

string StringConcatenate2( const string Str1, const double Str2, const string Str3, const string Str4 )
{
  return(Str1 + (string)Str2 + Str3 + Str4);  
}
   
string StringConcatenate2( const string Str1, const string Str2, const int Str3 )  { return(Str1 + Str2 + (string)Str3); }
   

#property indicator_buffers 0
#property indicator_plots 0

#define  Symb  SymbTmp
#define NULL  ""

#property indicator_separate_window
#include "TradeInfo.mq4" //https://github.com/icefx/tradeinfo/blob/master/TradeInfo.mq4

// #属性 indicator_chart_window
// #include "ProfitInfo.mq4" //https://github.com/icefx/profitinfo/blob/master/ProfitInfo.mq4

// #属性 indicator_chart_window
// #include "IceFX.DrawProfit.mq4" //https://github.com/icefx/drawprofit/blob/master/IceFX.DrawProfit.mq4

像往常一样,我没有动 MT4 的原始代码。

您可以从源代码中清楚地看到作者在代码中使用了 StringConcatenate。这太愚蠢了!

 

TO: fxsaber

谢谢你,好心人。还有很多工作要做。向您致敬。

最后两个指标(ProfitInfo、IceFX.DrawProfit)真的出现了 44 个错误。缺少了一些东西。但这并不重要。

重要的是,如果有必要,您现在可以快速将您的开发成果转化为 MKL5。

祝您好运

PS: 也许是时候将您的工作转移到 GitHub 了?
附加的文件:
Err.zip  229 kb
 
Vladimir Perervenko:

最后两个指标(ProfitInfo、IceFX.DrawProfit)出现了 44 个错误。有东西丢失了。

最有可能的是,他们不小心在某处多留了一个字符。

PS: 也许是时候将您的作品转移到 GitHub 了?

我不知道该怎么做。而且为什么要从已配置的资源中移除某些东西呢?

 
Vladimir Perervenko:
PS:也许是时候把你的工作转移到 GitHub 上了?

我已经建议了很久。我甚至还创建了一个 repo 并开始定期更新,但后来还是放弃了。


fxsaber:

为什么要从剖析资源中移除某些内容?

1.便于跟踪更新(在一个列表中显示所有编辑,在源代码中突出显示......)。鉴于 kodobase 中所有文件存档的问题(错误尚未修复),这一点尤为重要。

2.一键切换到任何版本(在工作终端)。

3.只需点击几下即可在新电脑上同步。

4. ...

5.摆脱本地专制 管理。删除评论、代码、文章或账户是家常便饭。封杀异议者也是家常便饭(我就不多说了)。


例如,getch-a 和 hrenfx 的开发现在已经很难找到,有些甚至根本找不到。fxsaber 明天会怎么样?;)

 
fxsaber:


从源代码中,你可以清楚地看到哪些作者在他们的代码中使用了 StringConcatenate。这太愚蠢了!

正确的方法是什么?

如果你用 "+"替换它 - 它会转换。如果在StringConcatenate() 中有两个参数,它就会转换,如果有更多参数,它就不会转换。

 
Vladimir Perervenko:

正确的方法是什么?

Str = Str1 + Str2 + Str3 + ....;
 
Andrey Khatimlianskii:

我已经建议了一段时间。我甚至还创建了一个 repo,并开始定期更新,但后来就不了了之了。


1.方便跟踪更新(所有编辑都在一个列表中,在源代码中突出显示......)。鉴于 kodobase 中所有文件存档的问题(错误尚未修复?)

2.一键切换到任何版本(在工作终端)。

3.点击几下即可在新电脑上同步。

4. ...

5.摆脱本地管理层 傲慢。删除评论、代码、文章或账户是家常便饭。禁止持不同政见者也是常规程序(不用我说)。

谢谢你列出的论据。我会努力研究这个话题。

 
fxsaber:

感谢您提供的论据清单。我会努力研究这个问题。

论坛上有一个讨论。
BitBucket + utf8 编码 + 用于同步的源代码树 = 准备就绪的存储库
 
Andrey Khatimlianskii:
论坛上曾有过这样的讨论
BitBucket + utf8 编码 + 用于同步的 SourceTree = 准备就绪的存储库

最多可有 5 人同时拥有编辑权。