如何编码? - 页 293

 
lincoln2012:
我正在努力学习MQ4。我的第一个简单程序应该是在两个MAs交叉时弹出一个警报。我不明白为什么

这个代码不工作。

如果有任何帮助,我将非常感激谢谢。

外置int Period_MA1 = 5;

外置int Period_MA2 = 1;

双重MA1。

双重MA2。

int init()

{

返回(0)。

}

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

int deinit()

{

return(0);

}

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

int start()

{

//--------------------------------------------------------------------

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0)。

MA2=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0)。

//--------------------------------------------------------------------

如果(MA2 == MA1 )

Alert("Price is the same(",Period_MA2,").");// Alert

返回。

}

你好,林肯2012。

可以看看 这个Ma Cross的代码

附加的文件:
macross-1.mq4  7 kb
 
lincoln2012:
我正在努力学习MQ4。我的第一个简单程序应该是在两个MAs交叉时弹出一个警报。我不明白为什么

这段代码不起作用。

}

对任何2条指标线 的交叉进行编码的关键是这个概念。

1.如果当前条形线1>条形线2,而前条形线1<条形线2,那么就有一个向上的交叉。

2.2.如果当前条形线1线2,那么就有一个向下的交叉。

 
mj10:

我在Mt4中做了一些编程工作,很有趣,但我不是专家,只是简单地编辑了一些旧指标。好吧,我想做一个简单的指标,但不知道怎么做。

它是一个简单的指标,它简单地检查值,如果所有变量的值是相同的,它画出所有变量的值匹配的那个点。

我的简单解决方案

假设我们得到了一些变量

double movingavg1;

double movingavg12;

double movingavg13;

double movingavg14;

double movingavg15;

double movingavg16;

double movingavg17;

double movingavg18;

double movingavg19;

double movingavg10;

double movingavgall;

我们声明变量,我只是举了一个例子,我使用的是iStochastic(1),但我们可以使用任何指标。

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

以此类推

现在

如果(movingavg12=movingavg13=movingavg14,....) (把数值放在变量 "movingavgall "中) //把等于vria的数值放进去

在条形图上画出movingavgall

应用

假设我想检查移动平均线3和移动平均线5的数值是否相同?

甚至这个指标可以和RSI一起使用,在RSI 1和RSI 2的值=80的情况下。

以及更多

即使我们添加MTF,也会有额外的好处。

书面上看起来很简单,但我无法找到解决方案,希望有人能帮助我。

希望你们能理解我的意思

谢谢

一旦你有了要比较的值,你就会使用类似于以下的代码。

检查 值是否相等使用==,一个=用来给一个变量赋值。

检查1个以上的集合必须使用&&来表示AND

movingavgall = 0。

如果((a == b) && (b == c) && (c == d)) movingavgall = a;

然后,你可以用以下方法检查movingavgall是否有一个值

如果(movingavgall != 0)

{

//在这里做一些事情

}

用谷歌搜索一下metatrader编程。

你应该能找到几个关于MT4编程的好教程。

一本关于C语言编程的好书也会有所帮助。

Robert Hill aka MrPip

 

简化这个代码

大家好!

我试图用stringconcatenate命令来简化这段代码。

ObjectSetText("uitog1v",StringConcatenate("/\\", uitog1v, "%"),12, hr1v, DodgerBlue ) 。

到此为止。

ObjectSetText("uitog1v",StringConcatenate("/\", uitog1v, "%", "/\", uitog2v, "%", "/\", uitog3v, "%"),12,StringConcatenate(hr1v,hr2v, hr3v), DodgerBlue )。

希望有人能帮助我。

最好的问候

doc

trend_alexcud_v_2men.mq4

附加的文件:
 

...

文件

如果你需要所有这些元素,没有比这更简单的写法了

dr.house7:
大家好!

我试图用stringconcatenate命令来简化这段代码。

ObjectSetText("uitog1v",StringConcatenate("/\\", uitog1v, "%"),12, hr1v, DodgerBlue ) 。

到此为止。

ObjectSetText("uitog1v",StringConcatenate("/\", uitog1v, "%", "/\", uitog2v, "%", "/\", uitog3v, "%"),12,StringConcatenate(hr1v,hr2v, hr3v), DodgerBlue )。

希望有人能帮助我。

最好的问候

文档

Trend_alexcud_v_2men.mq4
 

怎么做?每隔60秒发出警报

我如何编写一些代码,例如每隔60秒给我一个警报?

我已经创建了下面的代码,但它在我把它附加到图表上时,每分钟给我一个警报,我想让它跟随经纪人的时间,所以它每60秒给我一个警报。

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc 如果你需要所有这些元素,没有比这更简单的写法了

呃,这次运气不好,还是谢谢你。

最好的问候

文档

 

第二个StringConcatenate调用有一个问题。

你将3个不同的字体名称加在一起,不会有有效的结果名称。

罗伯特

dr.house7:
大家好!

我试图用stringconcatenate命令来简化这段代码。

ObjectSetText("uitog1v",StringConcatenate("/\", uitog1v, "%"),12, hr1v, DodgerBlue )。

到此为止。

ObjectSetText("uitog1v",StringConcatenate("/\", uitog1v, "%", "/\", uitog2v, "%", "/\", uitog3v, "%"),12,StringConcatenate(hr1v,hr2v, hr3v), DodgerBlue )。

希望有人能帮助我。

最好的问候

文档

Trend_alexcud_v_2men.mq4
 

需要帮助的EA......测试器中的交易没有被关闭

我正在开发一个EA,但无论我怎么做,都不能让它关闭交易。它能很好地打开交易,但当我想关闭交易时,EA却不能关闭它们。

我把我的EA代码的一部分贴出来,这样也许你们中的某个有经验的编码员可以弄清楚我为什么会有这个问题。买入交易 "和 "卖出交易 "这两个变量对整个EA来说是全局的。

注意:我只希望在任何时候有一个交易,无论是多头还是空头。这些交易是 "一直在 "的,所以当一个多头信号出现时,现有的空头应该被关闭,反之亦然。

它没有这样做。它正在做的是打开交易,然后打开更多的交易......再打开更多的交易......并保持打开,直到它们最终都碰到了它们的止损。

预先感谢

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

既然是部分代码:试着在卖出平仓时用symAsk替换symBid,在买入平仓时用symAsk替换symBid(反转平仓价格,你不能以买价平仓卖出,也不能以卖价平仓买入)

outofdebt:
我正在开发一个EA,但无论我做什么,我都不能让它关闭交易。它能很好地打开交易,但当我想关闭它们时,EA却不能关闭它们。

我把我的EA代码的一部分贴出来,也许你们中有经验的编码员能找出我为什么有这个问题。买入交易 "和 "卖出交易 "这两个变量对整个EA来说是全局的。

注意:我只希望在任何时候有一个交易,无论是多头还是空头。这些交易是 "一直在 "的,所以当一个多头信号出现时,现有的空头应该被关闭,反之亦然。

它没有这样做。它正在做的是打开交易,然后打开更多的交易......再打开更多的交易......并保持打开,直到它们最终都碰到了它们的止损。

预先感谢

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);