如何编码? - 页 319

 
Tomcat98:
编码员你好。

如何编写一些额外的编码行,使专家在交易获胜后停止?

点子已经在袋子里了,然后让专家停止...

非常感谢

Tomcat98

如果你有一些编码经验,请看下文。否则,请找一个编码员。

1) 在每次交易结束后,在OrdersHistoryTotal()中做一个循环,检查交易。

2) 检查最后一笔交易的关闭时间(OrderCloseTime())。

3) 如果是最后一笔交易,检查OrderProfit() ==利润。

如果利润==真,设置EndDayTrade==真&&LastTradeDay==年月日()。

如果利润==假,则设置EndDayTrade==假。

4) 当程序通过start()时,你需要在开始任何新的交易之前插入==> if EndDayTrade == false。因为它是真的,那么它将不会触发新的交易。

5)你将需要一个定时器函数 来检查新的一天。(假设新的一天是你想要触发新的交易)。

最简单的形式是 if (LastDay != DayofYear() )。

6) 在上述定时器函数中,设置 LastDay = DayofYear()。

如果 ( LastTradeDay != DayofYear() && EndDayTrade == true)

设置EndDayTrade == false,这样就重新开始了。

用户定义的变量

bool EndDayTrade = false。

int LastTradeDay = 9999999;

int LastDay = 999999;

希望这个解释足够清楚。

 
dasio:
你好。

我正在尝试合并这两段代码,但我遇到了麻烦。

我需要的是,当一个挂单成交后,另一个必须被取消。

谢谢你的支持

int opened =0;

int pending =0;

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

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol() !=Symbol()) continue;

if(OrderMagicNumber()!=Magic) continue;

if(OrderType()==OP_BUY || OrderType()==OP_SELL)

opened++;

else pending++;

}

if (opened>0 && pending>0)

{

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

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol() !=Symbol()) continue;

if(OrderMagicNumber()!=Magic) continue;

if(OrderType()!=OP_BUY && OrderType()!=OP_SELL)

OrderDelete(OrderTicket());

}

} [/PHP]

[PHP] extern int Magic = 68415;

extern int Orario_Inizio = 0;

extern int Orario_Fine = 6;

extern int Buffer = 0;

extern double Lotti = 0.1;

extern int TakeProfit = 10;

extern int StopLoss = 50;

double Massimo;

double Minimo;

int BarCount;

int BarStart;

int BarShift;

double MinLot;

double LotSize;

int i;

int ticket;

string Status;

string BuyStatus1;

string SellStatus1;

double Range;

string CommentoRange;

double pipMultiplier = 1;

int init()

{

}

int start()

{

if (Digits==3 || Digits==5)

{pipMultiplier = 10;}

else {pipMultiplier = 1; }

double TakeProfit1 = TakeProfit*Point*pipMultiplier;

double StopLoss1 = StopLoss*Point*pipMultiplier;

double Buffer1 = Buffer*Point*pipMultiplier;

double StopLossPrice = NormalizeDouble(StopLoss1,Digits);

double TakeProfitPrice = NormalizeDouble(TakeProfit1,Digits);

double BufferPrice = NormalizeDouble(Buffer1,Digits);

//CALCOLA LE BARRE DEL RANGE

if(Orario_Inizio>Orario_Fine)

{

BarCount=24+Orario_Fine-Orario_Inizio;

}

if(Orario_Inizio<Orario_Fine)

{

BarCount=Orario_Fine-Orario_Inizio;

}

//CALCOLA IL MASSIMO E IL MINIMO DEL RANGE

if(Hour()>=Orario_Fine)

{

BarStart=Hour()-Orario_Fine;

BarShift=BarStart+BarCount;

Minimo=iLow(NULL,PERIOD_H1,BarStart);

Massimo=0;

for(i=BarStart;i<=BarShift;i++)

{

Massimo=MathMax(Massimo,iHigh(NULL,PERIOD_H1,i));

Minimo=MathMin(Minimo,iLow(NULL,PERIOD_H1,i));

Range=(Massimo-Minimo)/Point;

}

}

else

{

Massimo=0;

Minimo=0;

return(0);

}

//CONTROLLA SE E' L'ORARIO PER POTER TRADARE

if(Hour()==Orario_Fine && OrdersTotal()<2)

{

//CONTROLLA SE IL MASSIMO E' STATO ROTTO. CONDIZIONE BUY

double OpenPriceBuy = NormalizeDouble((Massimo+BufferPrice),Digits);

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lotti,OpenPriceBuy,0,OpenPriceBuy-StopLossPrice,OpenPriceBuy+TakeProfitPrice,NULL,Magic,0,Blue);

//CONTROLLA SE IL MINIMO E' STATO ROTTO. CONDIZIONE SELL

double OpenPriceSell = NormalizeDouble((Minimo-BufferPrice),Digits);

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lotti,OpenPriceSell,0,OpenPriceSell+StopLossPrice,OpenPriceSell-TakeProfitPrice,NULL,Magic,0,Red);

if (ticket != -1)

return(0);

}

}

谁能帮帮我?

 

dasio

试着把整个代码放在start()程序的开头。当你开立挂单 时,你可能需要过滤掉一些方式,但如果你把这段代码放在开头,如果之前开立的挂单中有任何一个成为 "常规 "订单,它就会清理掉挂单。

dasio:
有人能帮忙吗?
 

你好。

我从这个主题中学到了很多东西,这也是我继续提问的原因。

现在。我试着自己做,但我还没有成功。

前提是我想在一个离线renko图表中使用这个指标。

我的目的是在蜡烛的上方或下方绘制多长时间的构造。

所以我知道,在蜡烛的规格中,有它打开的时间。因此,如果我用当前蜡烛的时间减去前一个蜡烛的时间,我就能得到我需要的东西。

那么我如何编写代码呢?

非常感谢你

 

不明白为什么这个代码试图修改已关闭的订单

我在两个if语句中加入了OrderCloseTime(),以为这样就可以结束ordermodify函数 的无效票据错误,但每隔一段时间,我的EA就会失去对所有订单的控制,并以某种方式混入一个已关闭的交易,并不断尝试修改它,产生巨大的日志文件,除非我重新启动MT4,否则不会继续交易。我不太确定它是如何接收到一个已关闭的订单的,也许当它在修改所有订单的过程中,其中一个订单在短时间内关闭,使它失去控制?就像我说的,这种情况在一天30-50次交易中可能会发生两次。

谁有什么办法来结束这种情况?

if (NewOrdersPlaced_s3) {

if (flag_s3 == TRUE) {

for (cnt_s3 = OrdersTotal() - 1; cnt_s3 >= 0; cnt_s3--) {

OrderSelect(cnt_s3, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_3 || OrderCloseTime()!=0) continue;

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_3 && OrderCloseTime()==0)// OrderModify(OrderTicket(), AveragePrice_s3, OrderStopLoss(), PriceTarget_s3, 0, Yellow);

//===

while(!OrderModify(OrderTicket(), AveragePrice_s3, OrderStopLoss(), PriceTarget_s3, 0, Yellow))

{Sleep(1000);RefreshRates();}

//===

NewOrdersPlaced_s3 = FALSE;

}

}
 

信号问题

mladen

非常感谢你的代码现在可以工作了。警报不再重复。请问我想主持一个脚本,将发送交易警报给多个收件人,如数百个,我怎么能做到这一点......是否有公司可以处理,你或本论坛的任何人知道。

Mastercash:
Mladen 谢谢你,我已经仔细看了....Im 还在实验代码。我将在通过时通知你。
 

...

2个想法:

1.如果你要发送,那么我认为唯一合理的方式是发送邮件,在这种情况下,你为什么不简单地使用一个在野外的电子邮件垃圾邮件程序?

2.发送信号有太多的问题(这是我的看法,发送的一些问题实际上是无法解决的)。所以你为什么不颠倒一下逻辑:不发送信号,而是制作一个代码,从一个给定的位置读取(包括用户名、密码等等......),这样你就解决了几乎所有发送信号无法解决的问题(包括防止同时从多个IP使用)。

所以,只是一些想法...

Mastercash:
mladen非常感谢你的代码现在工作了。警报不再重复。请问我想主持一个脚本,将发送交易警报给多个收件人,如数百人,我怎么能做到这一点...是否有公司可以处理,你或本论坛的任何人知道。
 

试试这样的方法。

#include

#define PAUSE_BEFORE_RETRY 1000

#define NumberOfReTries 3

if (NewOrdersPlaced_s3 && flag_s3 == TRUE)

{

for (cnt_s3 = OrdersTotal() - 1; cnt_s3 >= 0; cnt_s3--)

{

if (!OrderSelect(cnt_s3, SELECT_BY_POS, MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber_3) continue;

for (int retry=0; retry<NumberOfReTries; retry++)

{

OrderModify(OrderTicket(), AveragePrice_s3, OrderStopLoss(), PriceTarget_s3, 0, Yellow);

int error = GetLastError();

switch (error)

{

case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

case ERR_OFF_QUOTES:

case ERR_BROKER_BUSY:

case ERR_TRADE_CONTEXT_BUSY:

Sleep(PAUSE_BEFORE_RETRY);

continue;

case ERR_PRICE_CHANGED:

case ERR_REQUOTE:

continue;

default:

retry=NumberOfReTries;

}

}

NewOrdersPlaced_s3 = FALSE;

}

}
beakon:
我在两个if语句中都添加了OrderCloseTime(),以为这样就可以结束这种无效的ordermodify函数错误,但是每隔一段时间,我的EA就会失去对所有订单的控制,并以某种方式混入一个已关闭的交易,并不断尝试修改它,产生巨大的日志文件,除非我重新启动MT4,否则不会继续交易。我不太确定它是如何接收到一个已关闭的订单的,也许当它在修改所有订单的过程中,其中一个订单在短时间内关闭,使它失去控制?就像我说的,这种情况在一天30-50次交易中可能会发生两次。

有谁知道如何结束这种情况?

if (NewOrdersPlaced_s3) {

if (flag_s3 == TRUE) {

for (cnt_s3 = OrdersTotal() - 1; cnt_s3 >= 0; cnt_s3--) {

OrderSelect(cnt_s3, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_3 || OrderCloseTime()!=0) continue;

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_3 && OrderCloseTime()==0)// OrderModify(OrderTicket(), AveragePrice_s3, OrderStopLoss(), PriceTarget_s3, 0, Yellow);

//===

while(!OrderModify(OrderTicket(), AveragePrice_s3, OrderStopLoss(), PriceTarget_s3, 0, Yellow))

{Sleep(1000);RefreshRates();}

//===

NewOrdersPlaced_s3 = FALSE;

}

}
 

警报解决方案

我想我需要更多的解释,你能不能提示我如何编写和设置一个代码,帮助我同时向所有的客户发送警报。是通过在数据库中存储他们的电子邮件地址.....,但服务器语言,如php脚本,如何从mt4平台自动收集警报?......我想这就是问题所在,如果能有一个方法,可以发送到多个手机或电子邮件地址。你的建议,请?

mladen:
2个想法。

1.如果你要发送,那么我认为唯一合理的方式是发送邮件,在这种情况下,你为什么不干脆使用外面的垃圾邮件程序呢?

2.发送信号有太多的问题(这是我的看法,发送的一些问题实际上是无法解决的)。所以你为什么不颠倒一下逻辑:不发送信号,而是制作一个代码,从给定的位置读取(包括用户名、密码等等......),这样你就解决了几乎所有发送信号不能解决的问题(包括防止同时从多个IP使用)。

所以,只是一些想法...
 

掌握现金

试着在谷歌上搜索 "群发邮件",我想你会找到答案的。

至于 "收集警报":你必须有一些东西可以将其"导出"为一些可读的格式,然后被你选择的软件识别,以分发信号或允许访问该信号。

PS:信号服务比乍看之下要复杂得多,如果你打算做一个,你可以指望大量的费用来使其正常工作。

Mastercash:
我想我需要更多的解释,你能不能提示我如何编写和设置一个代码,以帮助我在同一时间向所有客户发送警报。是通过在数据库中存储他们的电子邮件地址.....,但服务器语言,如php脚本,如何从mt4平台自动收集警报?......我认为这是一个问题,如果可以有一个方法,它可以发送到多个手机或电子邮件地址。你的建议,请?