模仿EA/指示器的刻度线 - 页 5

 
Zhunko: 伊戈尔,这种断开网络连接的方式并不好。很多东西在这种模式下都不起作用。你不需要禁用互联网接入。

不,他的齿轮--在第一页,在winHp中工作正常,你错了,但在win7中,由于某些原因,它不愿意为我工作。

肉类:有一个假设,即代码在有64位win的地方不工作。我只有32个,所以无法检查。

不,我有win7 max 32bit

 
IgorM:

不,他的齿轮--在第一页,在winHP中工作正常,你错了,但在win7中由于某些原因,它不想为我工作。

伊戈尔,我说的不是阿列克谢的代码,我说的是切断与互联网的连接。
 
Zhunko:

你如何从一个滴答的指标进行交易?MQL4并没有提供这些。

真的!如果我可以在一个循环的专家顾问中做所有的事情,为什么我还需要增加不能交易的滴答指标?这不需要对WinAPI有任何困难,MT4界面不会变得更慢,EA的运行速度将提高三倍。为什么要把事情搞得那么复杂?

好吧,让我们离开这个讨论,反正它不会导致任何建设性的东西,很可能相反。你已经开始歪曲(我不知道是有意还是无意)我所写的意思,我在俄语中写道,我不是用指标交易,而是用metatrader交易,而你又在谈论某种用指标交易。 如果你从我所说的话中理解错了什么,那么我解释:"交易中使用指标 "这句话并不意味着交易由指标执行。

 
Meat:

我已经开始扭曲(我不知道是有意还是无意)我所写的内容的含义。你已经开始歪曲(我不知道是有意还是无意)我所写的意思,我在俄语中写道,我不是从指标上进行交易,而是从metatrader上进行交易,而你又在说一些从指标上进行的交易。 如果你误解了我之前说的一些话,那么我解释一下:"指标用于交易 "这句话并不意味着指标执行交易。

那么,一个接收指标信号的专家顾问是如何交易的?当然,MT4也能做到这一切?这是否正确?如果是这样,我的问题仍然存在。为什么不让专家顾问来做这一切呢?这是理性的做法。
 
Zhunko: 伊戈尔,我说的不是阿列克谢的代码,我说的是切断与互联网的连接。

是的,我明白,但他的代码在winhr的互联网被关闭的情况下是有效的。

这些代码,原则上是需要的,我们把它作为一个内嵌器,在周末的任何代码中都有刻度,在处理图形对象 时特别有用--人们经常要求制作 "智能尺 "等等,在周末你必须 "用眼睛 "制作代码。

 
IgorM:

是的,我明白,但他的代码在winhr的互联网被关闭的情况下是有效的。

而代码,原则上是需要的,把它作为一个inluder,并在周末在任何代码中打勾,在与图形对象工作时特别有用--人们经常要求制作 "智能标尺 "等等,在周末必须 "用眼睛 "制作代码。

好吧,我发布的代码在任何地方都适用。一句话。没有定时器。它可以在所有指标和任何操作系统上工作。对于一个实验来说,这已经足够了。

我还给出了上述专家顾问的代码。为专家顾问生成刻度线的那一行可以在指标的代码中替换。在这种情况下,它也会影响专家。

图书馆 可以被简化。一切都已经在那里实现了。

 
Zhunko:
那么,一个接收指标信号的专家顾问是如何交易的?当然,MT4也会做这些事情?这是否正确?如果是这样,我的问题仍然存在。为什么不让专家顾问来做这一切呢?这是理性的做法。

如果我们谈论的是自动交易,那么指标或刻度线的问题根本就不会被提出来,因为那里不需要它们。 所以你一定是从一开始就误解了这个话题的重点。

 

顺便说一句,这里还有一件事。航线

TimerCode[byte/4] += (value[i]>>(8*j)&0xFF) <<(byte%4*8);

应被替换为

TimerCode[byte/4] |= (value[i]>>(8*j)&0xFF) <<(byte%4*8);

否则在再次调用SetMyTimer时就会出现错误,或者你可以在开始循环之前将数组初始化为0。

至于Win7,我从来没有设法在那里重现这个问题,对我来说一切正常。而盲目地做调试是不现实的。我想知道这里是否有其他人有这个代码也能在第七版上工作? 因为我感觉到我在运行某种特殊的Windows。

 

我想我找到了错误所在。 这里是SetMyTimer函数的修正版。

int SetMyTimer(int interval)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0) return(0);
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int value[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  value[8]=MT4InternMsg;  value[10]=hWnd;  value[12]=PostMsgAddr; 
  int byte=0;  ArrayInitialize(TimerCode,0);
  for (int i=0;  i<ArraySize(value);  i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] |= value[i]>>(8*j)&0xFF<<(byte%4*8);

  return ( SetTimer(hWnd, TimerId, interval, TimerCode) );
}

现在应该工作正常了。

 

没有...,不工作

日志中没有错误,甚至终端中的互联网,在Vadim的建议下,也没有断开连接--反正输出上没有刻度。