新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 845

 
Anatoliy Ryzhakov:
你好。你能告诉我如何返回历史上 倒数第二个订单 的类型值吗?

你需要找到最后一个关闭订单的时间,然后搜索具有最大关闭时间的订单,但小于最后记忆的时间,这是我所做的。

https://www.mql5.com/ru/forum/247136#comment_7555643

在我的例子中,搜索到的是票据,你需要返回订单类型而不是票据,或者知道订单的票据,你可以找出它的类型......

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

是否有可能将一个模板应用于可导出的函数,以便从c++导出到mql4?

我创建了一个扩展名为 "srp "的普通类型的文件,并在那里写了一个原始函数。

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

然后我创建了一个扩展名为 "def "的文件,并指定了要导出的函数的名称

LIBRARY "dllmt42"
EXPORTS
add

然后通过Build-Build Solution运行它。
我想给我的函数应用一个模板,因为我们要开发与数组打交道的函数,没有模板是不行的。

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T被高亮显示,但写着有一个错误的帮助建议,是否有可能,尝试重新排列?另外,如果可能的话,如何从mql4方面调用这样的函数?




 
Roman Shiredchenko:

在代码库中查看 - 在MT4上,他们肯定是...

就在头版,在这个主题中。

 

晚上好。在研究和学习MT5的过程中试图实施一项一般不难的任务,但由于经验不足和知识差距.......,一般情况下是行不通的,请帮助和协助。

我有一个指标和专家顾问,都有开放的源代码,都是同一个作者(Artem Trishkin,尊重和赞扬)。我是想让指标在询问的时候得到实际的方向。指示器用向上或向下的箭头显示这个方向。获得的方向将被专家顾问作为信号或过滤器使用,但它仍然是遥远的。

我得到了指标手柄,但指标中箭头的数据值却很混乱,我无法弄清楚。

我没有改变指标,我在专家顾问中加入了OnInit。

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

我添加了OnTick。

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

当然,我描述并启动了适当的overpens,数组,定义为时间序列和td......

用评论 和打印来检查。不是立即,但没有错误,只有几个警告,我不明白。但最主要的是--参数的定义是不正确的。尽管有下面的条件,向上箭头的最大数字为双倍,向下箭头的一些负数被输出。

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
以下是这些文件
附加的文件:
 
Sergey Voytsekhovsky:
以下是这些文件

你可以先用一个简单的测试EA来测试从指标中获取数据,而不是从一篇有很多不必要的功能的文章中拿出来进行测试。

只要在MQL向导中创建一个简单的专家顾问,并使用它来练习使用iCustom()。

 
Sergey Voytsekhovsky:

晚上好。在研究和学习MT5的过程中试图实施一项一般不难的任务,但由于经验不足和知识差距.......,一般情况下是行不通的,请帮助和协助。

我有一个指标和专家顾问,都有开放的源代码,都是同一个作者(Artem Trishkin,尊重和赞扬)。我是想让指标在询问的时候得到实际的方向。指示器用向上或向下的箭头显示这个方向。获得的方向将被专家顾问作为信号或过滤器使用,但它仍然是遥远的。

我得到了指标手柄,但指标中箭头的数据值却很混乱,我无法弄清楚。

我没有改变指标,我在专家顾问中加入了OnInit。

我添加了OnTick。

当然,我描述并启动了适当的overpens,数组,定义为时间序列和td......

用评论 和打印来检查。不是立即,但没有错误,只有几个警告,我不明白。但最主要的是--参数的定义是不正确的。尽管有下面的条件,向上箭头的最大双数和向下箭头的一些负数被打印出来。

Artyom说得很对,我只想指出一个对比的无谓性

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

如果CopyBuffer返回复制到数组中的元素数,那么数组的大小将正好是这个数。因此,该条件的高亮部分只是重复了第一个条件。

还有一个想法:我没有看过指标和EA的代码,所以我可能是错的。你确定在period_find范围内一定有一个信号吗?

 
Alexey Viktorov:

阿特姆说得很对,我只想指出一个对比的无谓性

如果CopyBuffer返回复制到数组中的元素数,那么数组的大小将正好是这个数。相应地,条件的选定部分只是重复了第一个条件。

我在想:我没有检查过指标和专家顾问的代码,所以我可能是错的。你确定在period_find范围内一定有一个信号吗?

是的 - 它就像一个过滤器 - 信号的频率取决于它。

 
Artyom Trishkin:

你会先用一个简单的测试EA从指标中获取数据,而不是从一篇有很多不必要的功能的文章中拿出来进行测试。

iCustom() 函数对你来说会更方便。

谢谢你,好建议,我会这样做的,至少这样做会更方便。

我将在今天开始。
 

你能告诉我该地段的配给有什么问题吗?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }
原因: