如何编码? - 页 271

 

需要帮助这个EA的iCustom函数可以调用一个自定义指标。

嗨,大家好。

我想在这个(swb grid 4.1.0.3_EA)EA中添加这个(Entry.mq4)指标,并使用

iCustom函数,这样我和我们可以在EA的策略中使用这个指标。

该EA已经使用了3个MT4指标布林线、随机指数和RSI,并且有开关,所以你可以选择其中一个或多个指标。

开关,所以你可以通过选择 "真 "或 "假 "来选择使用它们中的一个或全部。

我想在EA中添加第四个指标(Entry.mq4)。

如果有人能帮助我,我将非常感激。

谢谢你。

下面是EA和indi的附件。

附加的文件:
 

需要MQL4的帮助来理解这个数组

嗨,编码员

有谁能给我讲讲关于数组的知识吗?

或者说,我在理解这个循环时遇到了更多的麻烦,因为它与这个数组有关。

int i=Bars;

#property copyright "Unfinished POS by Agent86"

double v1[];

double v2[];

double val1;

double val2;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i)。

如果(val1 > 0)

{

v1=高。

}

否则

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i)。

如果(val2 > 0)

{

v2=Low。

}

否则v2=v2。

i--;

}

return(0);

}

这是一个基本的分形,但我似乎无法引用数组中的任何元素。

我希望能够以某种方式增加i++,并打印(v1); 或打印0或EMPTY_VALUE 之前的值。

如果我这样做的方向是正确的。

我遇到了麻烦。

Print (v1): 总是==0并打印出0

我有点明白了,因为它实际上是循环到了-1,==0

我怎样才能把Print语句放在哪里,以便我能够看到发生了什么?

我已经尝试了很多方法,并且重新初始化了i=0来尝试交替循环,这样我就可以引用v1元素,但是所有的尝试都失败了。

基本上,我想查看之前的分形,或将它们标记为A高、B低等,以便将来可能用于ABCD方案类型的EA。

目前,我主要是想打印v1,以便我可以看到它在做什么。

也许我可以设计一些东西来选择上一个分形,如A_high和/或B_low或一些类似的方案。

我是否走错了方向?

请指教

谢谢

 

我想用一个FOR循环来代替。因为你知道确切的条数,所以更容易使用,加上i永远不会<0,这有助于避免混淆。

For (int i=Bars-1;i>0;i--) {

//代码

}

试着将所有的数组值设置为0,然后再去分配指标值。另外,在分配完指标值后直接尝试print()。看看它是否真的返回任何东西。

我想,你最好的办法是给数组指定一个大小。比如,1000个位置。你不太可能需要这么多,而且这将减少你的计算量。你所需要做的就是循环查看最后999个条形图,然后赋值。我记得MT4在数组初始化和其他方面有问题。

 

阵列问题

Trader5050-Deployed:
我想用FOR循环来代替。如果你忘了包括i------,while循环会导致锁定。因为你知道确切的条数,所以更容易使用,再加上i永远不会<0,这有助于避免混淆。

对于(int i=Bars-1;i>0;i--){

//代码

}

试着将所有的数组值设置为0,然后再去分配指标值。另外,在分配完指标值后直接尝试print()。看看它是否真的返回任何东西。

我想,你最好的办法是给数组指定一个大小。比如,1000个位置。你不太可能需要这么多,而且这将减少你的计算量。你所需要做的就是循环查看最后999个条形图,然后赋值。我记得MT4在数组初始化和其他方面有问题。

好的,谢谢,我会试试的。

虽然while语句运行良好,但它不能帮助我获得我想打印/查看的数组元素 等。

我会按照你说的去做,做一些测试,然后再发回来。

谢谢

 
Trader5050-Deployed:
我想用一个FOR循环来代替。如果你忘了包括i------,while循环会导致锁定。因为你知道确切的条数,所以更容易使用,而且i永远不会<0,这有助于避免混淆。

对于(int i=Bars-1;i>0;i--) {

//代码

}

试着将所有的数组值设置为0,然后再去分配指标值。另外,在分配完指标值后直接尝试print()。看看它是否真的返回了什么。

我想,你最好的办法是给数组指定一个大小。比如,1000个位置。你不太可能需要这么多,而且这将减少你的计算量。你所需要做的就是循环查看最后999个条形图,然后赋值。我记得MT4在数组初始化和其他方面有问题。

仍然只是打印所有0的条目的数组。

很奇怪

 

Argent86,

你的代码中有几个错误。

- 你使用的数组还不是数组(如果你没有指定数组大小,就像你在代码中做的那样,那么它就是一个动态数组,数组大小必须在运行时管理),所以你的数组大小为0(这就是总是为0的第一个原因--这是metatrader错误处理程序防止致命错误,并在这种情况下返回0--在C/C++会导致崩溃)

- 如果你没有指定数组是 "串联式 "的(在 "串联式 "中第0个元素是最后一个,而在普通数组中第0个元素是第一个),那么在这种情况下表达式i+1是数组的下一个元素而不是上一个。你可以以 "类似系列 "的方式使用数组,但你必须做更多的事情,以使它在运行时工作,即使这样,当条形数字改变时,你也会得到爬行代码,所以最好在其原始模式下使用数组--"类似C "模式

- 还要确保你至少从新刻度线上的第3个条形开始(新的分形 会在这里出现,而不是在当前条形上)。


以下是您在没有这些问题的情况下所做的尝试
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

从MQ4访问一个带有:变量参数表的dll函数

你好。

有谁知道这是否可行:导入一个dll函数,该函数使用的参数是:可变参数列表。

例如:vprintf - C++参考资料

int vprintf ( const char * format, va_list arg ) 。

如果是这样,该怎么做?

谢谢

MJ

[删除]  

如何调用没有返回值的函数

大家好。

在我的程序中,我想调用一个函数。

但是该函数没有返回值(void)。那么我如何调用这个函数呢?

以便在我调用函数的地方准确地执行函数中的代码。

就像它本身写在那个地方一样?

我在下面做了一些示例代码......在那里我检查了一些参数,如果OK,我想执行这个函数......。

希望有人能帮我解决这个问题,谢谢你,Jonkie76

//+------------------------------------------------------------------+

//|专家启动功能|

//+------------------------------------------------------------------+

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; // 这时我想调用函数.怎么做?

否则

Alert("Do nothing"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNCTIONS

//===================================================================+

//----------------------- 关闭订单功能 ----------------------+

空白subCloseOrder()

{

int

i,

total = 0,

ticket = 0。

err = 0。

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderSymbol()==Symbol() &&)

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet) 。

err=GetLastError()。

如果(err==0)

{

if(ticket>0) break;

}

否则

{

如果(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //忙乱错误

{

Sleep(5000);

继续。

}

否则 //正常错误

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}

 

这很简单。你只需要调用它,因为它将返回一些东西,只是你不需要保存任何结果,因为无效类型根本就没有结果。(不返回任何东西)像这样。

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

用 "void "代替。像这样:

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Void意味着它不会从一个函数 中返回值,这样它就有效地成为一个过程,而不是一个函数。

Jonkie76:
伙计们,姑娘们,你们好。

在我的程序中的某个时刻,我想调用一个函数。

但是这个函数没有返回值(void)。那么我如何调用这个函数呢?

以便在我调用它的地方准确地执行函数中的代码。

就像它本身写在那个地方一样?

我在下面做了一些示例代码......在那里我检查了一些参数,如果OK,我想执行这个函数......。

希望有人能帮我解决这个问题,谢谢你,Jonkie76

//+------------------------------------------------------------------+

//|专家启动功能|

//+------------------------------------------------------------------+

int start()

{

//----

if (Price >= PRICE_CLOSE)

call function ; // 这时我想调用函数.怎么做?

否则

Alert("Do nothing"); //

//----

return(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNCTIONS

//===================================================================+

//----------------------- 关闭订单功能 ----------------------+

空白subCloseOrder()

{

int

i,

total = 0,

ticket = 0。

err = 0。

c = 0;

total = OrdersTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderSymbol()==Symbol() &&)

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

case OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet) 。

err=GetLastError()。

如果(err==0)

{

if(ticket>0) break;

}

否则

{

如果(err==0 || err==4 || err==136 || err==137 || err==138 || err==146) //忙乱错误

{

Sleep(5000);

继续。

}

否则 //正常错误

{

if(ticket>0) break;

}

}

}

break;

}

}

}

}