谢谢你,我们会研究的。
你能给我发一段从请求开始到收到ping失败的日志吗(检查超时很重要)?这是在真实账户还是模拟账户?
你能给我发一段从请求开始到收到ping失败的日志吗(检查超时很重要)?这是在真实账户还是模拟账户?
<br/ translate="no"> 谢谢,我们会研究的。
你能不能发送一段从提出请求到收到ping失败的日志(检查超时很重要)?这是在真实账户还是模拟账户上?
你能不能发送一段从提出请求到收到ping失败的日志(检查超时很重要)?这是在真实账户还是模拟账户上?
这是在一个模拟账户上。日志...我关闭并打开了MT,所以 "日志 "标签条目被更新。我下次会复制它,然后重新启动它,感觉需要几天时间,我是说问题的复发。我只能建议从 experts/logs 目录中获取日志。这就是你所想的吗?在账户历史中,该交易对应于以下一行(顺便问一下,为什么在这个标签中没有逐行复制到缓冲区?)1728130 2005.08.31 15:00 买入 0.10 eurusd 1.2223 1.2183 0 2005.08.31 20:07 1.2330 0 107.00 星期五 我在莫斯科,在分析交易时间时可能需要。请注意,专家顾问在晚上8:07关闭交易。事实上,关闭条件是在晚上8:01,但头寸并没有关闭。我关闭和打开MT,在20.07,即立即,在重新启动后的几秒钟内关闭了位置。现在看了看日志(整个日志),但它是147Kb。如果你想要的话,我会附上它,但相信我,这笔交易只有两个条目: 17:00:18 _Friday_Expert EURUSD,H1: open #1728130 buy 0.10 EURUSD at 1.2223 sl: 1.2183 ok ...22:07:24 _Friday_Expert EURUSD,H1: close #1728130 buy 0.10 EURUSD at 1.2223 sl: 1.2183 at price 1.2330 所以似乎没有尝试在20.01
平仓。"算是吧",因为a)"日志 "标签(我没想到MT会重置它)显示了关于ping尝试和失败的说明,b)由于这不是这个EA的第一个问题,看看它从内部看起来如何:
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
{
SaveComment("\r\n\t" + MathFloor(CurTime() / 3600) + " - " +
MathFloor(OrderOpenTime() / 3600) + " >= " + nHoursToHold);
int nCurHour = TimeHour(CurTime());
int nOrderOpenHour = TimeHour(OrderOpenTime());
if(nOrderOpenHour > nCurHour)
nCurHour += 24;
// if(MathFloor(CurTime() / 3600) - MathFloor(OrderOpenTime() / 3600) >= nHoursToHold)
if(nCurHour - nOrderOpenHour >= nHoursToHold)
{
if(OrderType() == OP_BUY)
{
CloseBuy("Friday");
SaveComment(", nbuy closed");
}
else if(OrderType() == OP_SELL)
{
CloseSell("Friday");
SaveComment(", sell closed");
}
}
}
}
...
void CloseBuy(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket);
int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
}
// ------
void CloseSell(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket);
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
}
// ------
SaveComment只是将文本写到一个文件中。因此,文件中所有适合尝试平仓的条目都出现了,但警报没有被调用,即OrderClose返回了成功完成代码。
因此,正如我所承诺的,我一直在等待错误的重复。请注意,这个错误已经出现在另一个EA上,所以它可能不是代码的错误(尽管一切都有可能)。但该专家顾问 "还没有准备好",因为它没有填入所有可能的功能来输出到文件。
在日志中出现了一个错误:ping failed。
也许在ping失败后,你的系统不应该允许OrderSend被执行,那么就会产生一个错误信息。
在这种情况下,没有错误信息,只有一条日志记录。程序的行为就像它设法关闭交易一样,只是交易没有关闭。
因此,在日志中:
2005.09.05 16:01:35 TradeContext: ping failed
2005.09.05 16:01:35 TradeContext: ping error
2005.09.05 16:01:14 '142605': close order #1775545 sell 0.10 EURUSD at 1.2535 sl: 0。0000 tp: 0.0000 at price 1.2542
2005.09.05 16:01:14 '142605': login (4.00, #27FFBBD7)
顺便说一句,我真的很奇怪为什么sl: 0.0000,我不发送零。
同时,启动功能看起来像这样:
在日志中出现了一个错误:ping failed。
也许在ping失败后,你的系统不应该允许OrderSend被执行,那么就会产生一个错误信息。
在这种情况下,没有错误信息,只有一条日志记录。程序的行为就像它设法关闭交易一样,只是交易没有关闭。
因此,在日志中:
2005.09.05 16:01:35 TradeContext: ping failed
2005.09.05 16:01:35 TradeContext: ping error
2005.09.05 16:01:14 '142605': close order #1775545 sell 0.10 EURUSD at 1.2535 sl: 0。0000 tp: 0.0000 at price 1.2542
2005.09.05 16:01:14 '142605': login (4.00, #27FFBBD7)
顺便说一句,我真的很奇怪为什么sl: 0.0000,我不发送零。
同时,启动功能看起来像这样:
int start()
{
if(Bars < 5)
return(0);
Report("Friday", nMagic, bReportDone);
// ------
if(!IsBarEnd())
return(0);
CheckTradeSemaphore();
// ------
if(bUseMm == true)
{
dProfit = 0;
for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL)
{
dProfit += OrderProfit();
}
}
}
int nSignal = GetSignal();
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
switch(nSignal)
{
case -1: SaveComment(", Signal: none"); break;
case OP_BUY: SaveComment(", Signal: buy"); break;
case OP_SELL: SaveComment(", Signal: sell"); break;
default: SaveComment(", Signal: ????"); break;
}
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
{
SaveComment("\r\n\t" + MathFloor(CurTime() / 3600) + " - " +
MathFloor(OrderOpenTime() / 3600) + " >= " + nHoursToHold);
int nCurHour = TimeHour(CurTime());
int nOrderOpenHour = TimeHour(OrderOpenTime());
if(nOrderOpenHour > nCurHour)
nCurHour += 24;
// if(MathFloor(CurTime() / 3600) - MathFloor(OrderOpenTime() / 3600) >= nHoursToHold)
if(nCurHour - nOrderOpenHour >= nHoursToHold)
{
if(OrderType() == OP_BUY)
{
CloseBuy("Friday");
SaveComment(", buy closed");
}
else if(OrderType() == OP_SELL)
{
CloseSell("Friday");
SaveComment(", sell closed");
}
}
}
}
int nNumOfOpenedOrders = 0;
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
nNumOfOpenedOrders++;
}
if(nNumOfOpenedOrders == 0)
{
if(nSignal == OP_BUY)
{
SaveComment("\r\n\tAsk: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit);
Buy("Friday");
SaveComment("\r\n\tbuy opened");
}
else if(nSignal == OP_SELL)
{
SaveComment("\r\n\tBid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit);
Sell("Friday");
SaveComment("\r\n\tsell opened");
}
}
SaveComment("\r\n");
// ------
// ModifyOrders();
// ------
if(!IsTesting())
GlobalVariableSet(strTradeSemaphore, 0.0);
// ------
return(0);
}
SaveComment是一个将字符串输出到文件的函数。 这里有从开始调用的关闭位置函数。正如你所看到的,它尝试平仓5次(我这样做只是为了测试),如果没有错误代码返回(即MT认为该头寸已经关闭),它就在仍然未平仓的订单中寻找具有所需票据的那一个。
void CloseSell(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket);
for(int nTry = 0; nTry < 5; nTry++)
{
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
SaveComment("\r\n\tOrder with this ticket still present, trying again");
}
}
下面的日志显示,所有5次关闭订单的尝试都失败了(票据没有消失),MT认为该仓位已经关闭。5.9.2005 14:1:29, Signal: none 312758.00000000 - 312754.00000000 >= 4 试图关闭空头头寸,票据:1775545 此票据的订单仍然存在,再次尝试 此票据的订单仍然存在,再次尝试 此票据的订单仍然存在,再次尝试 此票据的订单仍然存在,再次尝试,出售关闭 注意:不要害怕 "信号:无" - 它应该像这样。这是一个开仓的信号。如果满足 "312758.00000000-312754.00000000>=4 "的不等式,则产生平仓的信号, 亲爱的开发者!我非常希望我们能一起解决这个问题。Quark P.S. 像往常一样,重新启动MT,我得到了EA的平仓,没有出现任何问题。
仍在等待开发商的答复。
在我所有的EA中,当试图打开-关闭交易时,增加了将结果写入文件的代码。其结果是令人失望的。大约每次,对所有的EA来说,一次尝试开仓-平仓都是不够的。平均而言,它需要两次(见上面的代码,有一个五次尝试的周期)。有时五次尝试是不够的。同时,MT的工作原理是,如果订单成功打开-关闭,没有错误信息。
我使用了 "错误6 "分支中建议的所有信号系统(顺便说一下,有时仍会发生),加上专家顾问的定时器保证每个EA在其专用的10秒内启动,也就是说,EA之间不应该有冲突。
我建议其他开发者在真实的EA中使用下面的代码,以检查你的所有订单是否按照你期望的方式运行。从交易的角度来看,它只是一个普通的OrderSend,周围有输出到一个文件的功能。
无意冒犯,但似乎MT需要对与贸易服务器的互动进行微调。
。
在我所有的EA中,当试图打开-关闭交易时,增加了将结果写入文件的代码。其结果是令人失望的。大约每次,对所有的EA来说,一次尝试开仓-平仓都是不够的。平均而言,它需要两次(见上面的代码,有一个五次尝试的周期)。有时五次尝试是不够的。同时,MT的工作原理是,如果订单成功打开-关闭,没有错误信息。
我使用了 "错误6 "分支中建议的所有信号系统(顺便说一下,有时仍会发生),加上专家顾问的定时器保证每个EA在其专用的10秒内启动,也就是说,EA之间不应该有冲突。
我建议其他开发者在真实的EA中使用下面的代码,以检查你的所有订单是否按照你期望的方式运行。从交易的角度来看,它只是一个普通的OrderSend,周围有输出到一个文件的功能。
无意冒犯,但似乎MT需要对与贸易服务器的互动进行微调。
。
double GetLotSize(double dInitFraction = 0.1, double dProfitFraction = 0.1)
{
double dLot = 0.1;
if(bUseMm)
{
dLot = (dInitFraction * dInitAmount + dProfitFraction * dProfit) / 1000;
dLot = MathFloor(dLot * 10) / 10;
if(dLot < 0.1)
dLot = 0.1;
}
return(dLot);
}
// ------
void Sell(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Bid - dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment("Trying to sell, attempt " + nTry + "\r\n");
nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss,
dTp, strExpertName, nMagic, 0, OrangeRed);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
SaveComment(" failed, error " + GetLastError() + "\r\n");
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
}
}
// ------
void Buy(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Ask + dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment("Trying to buy, attempt " + nTry);
nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss,
dTp, strExpertName, nMagic, 0, Aqua);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
SaveComment(" failed, error " + GetLastError() + "\r\n");
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
}
}
// ------
void CloseBuy(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket);
for(int nTry = 0; nTry < 5; nTry++)
{
int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
SaveComment("\r\n\tOrder with this ticket still present, trying again");
}
}
// ------
void CloseSell(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket);
for(int nTry = 0; nTry < 5; nTry++)
{
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
SaveComment("\r\n\tOrder with this ticket still present, trying again");
}
}
// ------
void SaveComment(string strComment)
{
if(!IsTesting())
{
int hFile = FileOpen("__test_" + strExpert + "_" + Symbol() + ".txt",
FILE_BIN | FILE_READ | FILE_WRITE, '\t');
FileSeek(hFile, 0, SEEK_END);
FileWriteString(hFile, strComment, StringLen(strComment));
// FileFlush(hFile);
FileClose(hFile);
}
}
// ------
我现在也有8个EA挂着,都在M5上。
从00:00到12:00
行业 - 141
3个错误("1 "和两个 "6")。
夸克,你能不能把你的EA(在M1上)的最后一个故障版本扔给我,让我在komposterius电子邮件中毁掉?我将再挂8个窗户--看看会发生什么;)
从00:00到12:00
行业 - 141
3个错误("1 "和两个 "6")。
夸克,你能不能把你的EA(在M1上)的最后一个故障版本扔给我,让我在komposterius电子邮件中毁掉?我将再挂8个窗户--看看会发生什么;)
你们错过了主要的一点。我没有一分钟的专家。所有的交易都是按时进行的。我没有频繁的交易,最多每小时一次。
专家们等待(使用semaphores)一个队列,此外,魔法数字等于,例如10的EA,等待10 * 10 = 100秒,从一个酒吧的开始,只有这样它才会交易。因此,即使没有信号灯,遇到有魔法11的EA的机会也接近于0。
印象中,如果MT失败一次(ping失败,错误6,等等),他的系统就会出问题,这个EA的后续交易就会失败。
日志的例子(上面显示的代码)。
试图购买,0次尝试失败,错误6
试图购买,尝试1失败,错误129
试图购买,尝试2失败,错误129
试图购买,尝试3次失败,错误129
试图购买,尝试4次失败,错误129
之字形买入错误:4050
2.28000000, 0.02700000, 0.00000000
我们这里有什么?首先出现了一个故障(在日志中--与服务器的连接错误)。然后重试了5次(我的循环中有5次),结果是129 - 错误的价格。下面是价格--很正常。在以这个价格重新启动MT后,订单被成功打开。然后我们得到4050,错误的论据数量。这是来自一个在其他调用中工作正常的函数。错误报告系统显然是失败的。
引述一位专家的话,尽管我怀疑你必须有很多这样的专家,问题才会经常发生。希望编纂者、罗氏和开发者能看看这些代码并提出一些建议。不过,我认为这里是一个MT的问题。
专家。
专家们等待(使用semaphores)一个队列,此外,魔法数字等于,例如10的EA,等待10 * 10 = 100秒,从一个酒吧的开始,只有这样它才会交易。因此,即使没有信号灯,遇到有魔法11的EA的机会也接近于0。
印象中,如果MT失败一次(ping失败,错误6,等等),他的系统就会出问题,这个EA的后续交易就会失败。
日志的例子(上面显示的代码)。
试图购买,0次尝试失败,错误6
试图购买,尝试1失败,错误129
试图购买,尝试2失败,错误129
试图购买,尝试3次失败,错误129
试图购买,尝试4次失败,错误129
之字形买入错误:4050
2.28000000, 0.02700000, 0.00000000
我们这里有什么?首先出现了一个故障(在日志中--与服务器的连接错误)。然后重试了5次(我的循环中有5次),结果是129 - 错误的价格。下面是价格--很正常。在以这个价格重新启动MT后,订单被成功打开。然后我们得到4050,错误的论据数量。这是来自一个在其他调用中工作正常的函数。错误报告系统显然是失败的。
引述一位专家的话,尽管我怀疑你必须有很多这样的专家,问题才会经常发生。希望编纂者、罗氏和开发者能看看这些代码并提出一些建议。不过,我认为这里是一个MT的问题。
专家。
extern double dZigzagSize;
extern int nMa1;
extern int nMa2;
extern int nBuySell;
// ------
double dTrailingStop;
double dStopLoss;
double dTakeProfit;
bool bUseMm = false;
string strExpert = "Zigzag";
// ------
#include "mylib.mq4"
// ------
int init ()
{
nBars = 0;//Bars;
if(!IsTesting() && !GlobalVariableCheck(strTradeSemaphore))
GlobalVariableSet(strTradeSemaphore, 0.0);
// ------
if(IsTesting() && nMa1 >= nMa2)
return(-1);
if(Symbol() == "EURUSD" && Period() == 60)
{
if(!IsTesting())
{
dZigzagSize = 210; // 210,60,108,3: 2397, 614
nMa1 = 48; // 210,48,120,1: 2016, 332
nMa2 = 120;
nBuySell = 1;
}
nMagic = 23;
}
else if(Symbol() == "EURJPY" && Period() == 60)
{
if(!IsTesting())
{ // 240,24,132,1: 1987, 387
dZigzagSize = 240;
nMa1 = 24;
nMa2 = 132;
nBuySell = 3;
}
nMagic = 2;
}
else if(Symbol() == "USDCHF" && Period() == 60)
{
if(!IsTesting())
{ // 260,36,204,2: 2219, 262
dZigzagSize = 260;
nMa1 = 36;
nMa2 = 204;
nBuySell = 2;
}
nMagic = 3;
}
else if(Symbol() == "GBPUSD" && Period() == 60)
{
if(!IsTesting())
{ // 270,48,84,3: 5515, 679
dZigzagSize = 270;
nMa1 = 48;
nMa2 = 84;
nBuySell = 3;
}
nMagic = 4;
}
else if(Symbol() == "GBPCHF" && Period() == 60)
{
if(!IsTesting())
{ // 270,96,108,1: 2854,292
dZigzagSize = 270;
nMa1 = 96;
nMa2 = 108;
nBuySell = 1;
}
nMagic = 5;
}
else if(Symbol() == "USDCAD" && Period() == 60)
{
if(!IsTesting())
{ // 220,60,300: 1906, 213
dZigzagSize = 220;
nMa1 = 60;
nMa2 = 300;
nBuySell = 2;
}
nMagic = 7;
}
else if(Symbol() == "EURAUD" && Period() == 60)
{
if(!IsTesting())
{ // 210,24,36,3: 3921, 545
dZigzagSize = 230; // 230,24,60,3: 3397, 453
nMa1 = 24; // 230,24,132,3: 2819, 292
nMa2 = 60;
nBuySell = 3;
}
nMagic = 9;
}
dStopLoss = dZigzagSize * Point;
dTrailingStop = dZigzagSize * Point;
dTakeProfit = 0;
return(0);
}
//////////////////
int deinit()
{
if(!IsTesting())
GlobalVariableSetOnCondition(strTradeSemaphore, 0.0, nMagic);
return(0);
}
////////////////////
int start()
{
if(Bars < MathMax(nMa1, nMa2))
return(0);
if(IsTesting() && nMa1 >= nMa2)
return(0);
Report("Zigzag", nMagic, bReportDone);
// ------
if(!IsBarEnd())
return(0);
CheckTradeSemaphore();
// ------
int nSignal = 0;
double dMa1;
double dMa2;
nSignal = iCustom(NULL, 0, "_Zigzag_Ind", dZigzagSize, 0, 1);
dMa1 = iMA(NULL, 0, nMa1, 0, MODE_EMA, PRICE_CLOSE, 1);
dMa2 = iMA(NULL, 0, nMa2, 0, MODE_EMA, PRICE_CLOSE, 1);
if(bUseMm == true)
{
dProfit = 0;
for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL)
{
dProfit += OrderProfit();
}
}
}
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
{
int nMode = OrderType();
if(nMode == OP_BUY && nSignal == 1)
{
CloseBuy("Zigzag");
break;
}
else if(nMode == OP_SELL && nSignal == -1)
{
CloseSell("Zigzag");
break;
}
}
}
int nNumOfOpenedOrders = 0;
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
nNumOfOpenedOrders++;
}
if(!nNumOfOpenedOrders)
{
if(nSignal == -1 && dMa1 >= dMa2)
{
if(nBuySell == 1 || nBuySell == 3)
Buy("Zigzag");
}
else if((nSignal == 1 && dMa1 <= dMa2))
{
if(nBuySell == 2 || nBuySell == 3)
Sell("Zigzag");
}
}
// ------
ModifyOrders();
// ------
if(!IsTesting())
GlobalVariableSet(strTradeSemaphore, 0.0);
// ------
return(0);
}
// ------
指标。
#property copyright "Quark"
#property link ""
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_minimum -1
#property indicator_maximum 1
// indicator parameters
extern int nMinMaxPoints = 50;
// indicator buffers
double arrExtMapBuffer[];
int nExtCountedBars = 0;
int nLastMinMaxBar;
int nLastMinMaxType;
double dLastMin, dLastMax;
////////////////////////
int init()
{
string strIndicatorShortName;
// drawing settings
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexShift(0, 0);
SetIndexEmptyValue(0,0.0);
IndicatorDigits(4);
strIndicatorShortName = "Zigzag(" + nMinMaxPoints + ")";
IndicatorShortName(strIndicatorShortName);
// indicator buffers mapping
SetIndexBuffer(0, arrExtMapBuffer);
dLastMin = Low[Bars - 1];
dLastMax = High[Bars - 1];
nLastMinMaxBar = Bars - 1;
nLastMinMaxType = 0;
int nPos = Bars - 1;
int nLastPos = nPos;
while(nPos >= 0) // Looking for a first min or max
{
if(dLastMax <= High[nPos])
{
dLastMax = High[nPos];
nLastMinMaxBar = nPos;
}
if(dLastMin >= Low[nPos])
{
dLastMin = Low[nPos];
nLastMinMaxBar = nPos;
}
if(Low[nPos] < dLastMax - nMinMaxPoints * Point) // Maximum found
{
nLastMinMaxType = 1;
dLastMin = Low[nPos];
dLastMax = High[nPos];
nLastMinMaxBar = nPos;
break;
}
else if(High[nPos] > dLastMin + nMinMaxPoints * Point) // Minimum found
{
nLastMinMaxType = -1;
dLastMax = High[nPos];
dLastMin = Low[nPos];
nLastMinMaxBar = nPos;
break;
}
nPos--;
}
return(0);
}
////////////////////
int start()
{
nExtCountedBars = IndicatorCounted();
if(nExtCountedBars < 0)
return(-1);
// last counted bar will be recounted
if(nExtCountedBars > 0)
nExtCountedBars--;
Zigzag();
return(0);
}
///////////////////
void Zigzag()
{
int nPos = Bars - nExtCountedBars - 2;
while(nPos > 0)
{
arrExtMapBuffer[nPos] = 0.0;
double dLastMaxTmp = dLastMax;
double dLastMinTmp = dLastMin;
if(nLastMinMaxType != 1) // Expecting maximum
{
if(dLastMax <= High[nPos])
{
dLastMax = High[nPos];
nLastMinMaxBar = nPos;
}
if(Low[nPos] < dLastMax - nMinMaxPoints * Point) // Maximum found
{
if(High[nPos] - Low[nPos] <= nMinMaxPoints * Point)
{
arrExtMapBuffer[nPos] = 1;//High[nLastMinMaxBar];
nLastMinMaxType = 1;
dLastMin = Low[nPos];
dLastMax = High[nPos];
nLastMinMaxBar = nPos;
}
else
{
arrExtMapBuffer[nPos] = 0;
arrExtMapBuffer[nPos + 1] = 0;
dLastMax = dLastMaxTmp;
dLastMin = dLastMinTmp;
}
}
}
if(nLastMinMaxType != -1) // Expecting minimum
{
if(dLastMin >= Low[nPos])
{
dLastMin = Low[nPos];
nLastMinMaxBar = nPos;
}
if(High[nPos] > dLastMin + nMinMaxPoints * Point) // Maximum found
{
if(High[nPos] - Low[nPos] <= nMinMaxPoints * Point)
{
arrExtMapBuffer[nPos] = -1;//Low[nLastMinMaxBar];
nLastMinMaxType = -1;
dLastMax = High[nPos];
dLastMin = Low[nPos];
nLastMinMaxBar = nPos;
}
else
{
arrExtMapBuffer[nPos] = 0;
arrExtMapBuffer[nPos + 1] = 0;
dLastMax = dLastMaxTmp;
dLastMin = dLastMinTmp;
}
}
}
nPos--;
}
}
///////////////////
/*
if(IsTesting())
{
FileDelete("__zigzag_test.txt");
hFile = FileOpen("__zigzag_test.txt", FILE_BIN | FILE_WRITE, '\t');
}
void SaveComment(string strComment)
{
if(IsTesting())
{
FileWriteString(hFile, strComment, StringLen(strComment));
}
}
if(IsTesting())
FileClose(hFile);
*/
库文件,必须位于专家目录中。
double dTp = 0;
//double dStop;
datetime timePrev = 0;
int nBars;
int nDelaySeconds = 10;
int nSlip = 5;
double dProfit = 0;
double dInitAmount = 1000;
double dLotSize = 0.1;
int nMagic = 0;
bool bReportDone = false;
string strTradeSemaphore = "TradeSemaphore";
// ------
void Report(string strFileName, int nMagic, bool& bReportDone)
{
if(IsTesting())
return;
if(Hour() == 0 && Minute() >= nMagic / 2 && IsTesting() == false)
{
if(bReportDone == false)
{
int hFile = FileOpen(strFileName + "_" + Symbol() + "_" + Period() + ".rpt",
FILE_BIN | FILE_WRITE, ',');
string str = "CloseDateTime,Buy,Sell\r\n";
FileWriteString(hFile, str, StringLen(str));
for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY);
if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol())
{
str = TimeToStr(OrderCloseTime(), TIME_DATE|TIME_MINUTES);
if(OrderType() == OP_BUY)
str = str + "," + OrderProfit() + ",0";
else
str = str + ",0," + OrderProfit();
str = str + "\r\n";
FileWriteString(hFile, str, StringLen(str));
}
}
FileFlush(hFile);
FileClose(hFile);
bReportDone = true;
}
}
else if(Hour() != 0)
bReportDone = false;
}
// ------
double GetLotSize(double dInitFraction = 0.1, double dProfitFraction = 0.1)
{
double dLot = 0.1;
if(bUseMm)
{
dLot = (dInitFraction * dInitAmount + dProfitFraction * dProfit) / 1000;
dLot = MathFloor(dLot * 10) / 10;
if(dLot < 0.1)
dLot = 0.1;
}
return(dLot);
}
// ------
void Sell(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Bid - dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
SaveComment(" Trying to sell, attempt " + nTry + "\r\n");
SaveComment("Ask: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit + "\r\n");
nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss,
dTp, strExpertName, nMagic, 0, OrangeRed);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
SaveComment(" failed, error " + GetLastError() + "\r\n");
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
}
}
// ------
void Buy(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Ask + dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
SaveComment(" Trying to buy, attempt " + nTry + "\r\n");
SaveComment("Bid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit);
nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss,
dTp, strExpertName, nMagic, 0, Aqua);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
SaveComment(" failed, error " + GetLastError() + "\r\n");
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
}
}
// ------
void ModifyOrders()
{
for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
{
if(OrderType() == OP_BUY)
{
if(OrderStopLoss() < Bid - dTrailingStop - 5 * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - dTrailingStop, OrderTakeProfit(), 0, Aqua);
break;
}
}
if(OrderType() == OP_SELL)
{
if(OrderStopLoss() > Ask + dTrailingStop + 5 * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + dTrailingStop, OrderTakeProfit(), 0, OrangeRed);
break;
}
}
}
}
}
// ------
/*
void ModifyOrders(double dTrailingConvergence = 1)
{
for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
{
OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
if(OrderMagicNumber() == nMagic)
{
if(dTrailingConvergence != 1)
{
dStop *= dTrailingConvergence;
dStop = NormalizeDouble(dStop, MarketInfo(Symbol(), MODE_DIGITS));
if(dStop < 10 * Point)
dStop = 10 * Point;
}
if(OrderType() == OP_BUY)
{
if(OrderStopLoss() < Bid - dStop - 5 * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - dStop, OrderTakeProfit(), 0, Aqua);
break;
}
}
if(OrderType() == OP_SELL)
{
if(OrderStopLoss() > Ask + dStop + 5 * Point)
{
OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + dStop, OrderTakeProfit(), 0, OrangeRed);
break;
}
}
}
}
}
*/
// ------
bool IsBarEnd()
{
bool bIsBarEnd = false;
if(nBars != Bars)
{
if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds))
{
bIsBarEnd = true;
nBars = Bars;
}
}
return(bIsBarEnd);
}
// ------
void CheckTradeSemaphore()
{
if(!IsTesting())
{
// int n = 1;
while(!IsStopped())
{
GlobalVariableSetOnCondition(strTradeSemaphore, nMagic, 0.0);
// if(GlobalVariableGet(strTradeSemaphore) == 0.0)
// GlobalVariableSet(strTradeSemaphore, nMagic);
if(GlobalVariableGet(strTradeSemaphore) == nMagic)
break;
// Comment(GlobalVariableGet(strTradeSemaphore) + ": " + n);
// n++;
Sleep(1000);
}
RefreshRates();
}
}
// ------
/*
void CloseBuy(string strExpertName)
{
int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + nError);
}
}
// ------
void CloseSell(string strExpertName)
{
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert("Noc_1 close: " + nError);
}
}
*/
// ------
void CloseBuy(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket + "\r\n");
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
SaveComment("\r\n\tOrder with this ticket still present, trying again");
}
}
// ------
void CloseSell(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket + "\r\n");
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
SaveComment("\r\n\tOrder with this ticket still present, trying again");
}
}
// ------
void SaveComment(string strComment)
{
if(!IsTesting())
{
int hFile = FileOpen("__test_" + strExpert + "_" + Symbol() + ".txt",
FILE_BIN | FILE_READ | FILE_WRITE, '\t');
FileSeek(hFile, 0, SEEK_END);
FileWriteString(hFile, strComment, StringLen(strComment));
// FileFlush(hFile);
FileClose(hFile);
}
}
// ------
你真的让我很感兴趣,夸克 :)
现在是开发商考虑给你的员工找一份工作的时候了,给他们找各种讨厌的东西。
也许是萍水相逢,我没有周期去重试下单,也许我应该在这个时候打电话给刷新,塞进更新鲜的价格。
我迷路了...:)
现在是开发商考虑给你的员工找一份工作的时候了,给他们找各种讨厌的东西。
也许是萍水相逢,我没有周期去重试下单,也许我应该在这个时候打电话给刷新,塞进更新鲜的价格。
我迷路了...:)
好吧,你终于被吸引住了,夸克:)<br / translate="no">现在是时候让开发人员考虑给你的员工找一个空缺,让你给他们找各种讨厌的东西。
也许是萍水相逢,我没有周期重试下单,也许我需要在这个时候打电话给刷新,塞进更新鲜的价格。
我开始迷路了......:)
也许是萍水相逢,我没有周期重试下单,也许我需要在这个时候打电话给刷新,塞进更新鲜的价格。
我开始迷路了......:)
好主意...现在可以了...
新版本,由罗氏公司投稿。
void Sell(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Bid - dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
SaveComment(" Trying to sell, attempt " + nTry + "\r\n");
SaveComment("Ask: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit + "\r\n");
nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss,
dTp, strExpertName, nMagic, 0, OrangeRed);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
{
SaveComment(" failed, error " + GetLastError() + "\r\n");
RefreshRates();
}
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " sell error: " + nError + "\r\n" +
Bid + ", " + dStopLoss + ", " + dTp);
}
}
// ------
void Buy(string strExpertName)
{
dLotSize = GetLotSize();
if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500)
return;
double dTp;
if(dTakeProfit == 0)
dTp = 0;
else
dTp = Ask + dTakeProfit;
int nResult;
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
SaveComment(" Trying to buy, attempt " + nTry + "\r\n");
SaveComment("Bid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit);
nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss,
dTp, strExpertName, nMagic, 0, Aqua);
if(nResult != -1)
{
SaveComment(" successfull\r\n");
break;
}
else
{
SaveComment(" failed, error " + GetLastError() + "\r\n");
RefreshRates();
}
}
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
SaveComment(strExpertName + " buy error: " + nError + "\r\n" +
Ask + ", " + dStopLoss + ", " + dTp);
}
}
void CloseBuy(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket + "\r\n");
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
SaveComment(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
{
SaveComment("\r\n\tOrder with this ticket still present, trying again");
RefreshRates();
}
}
}
// ------
void CloseSell(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket + "\r\n");
for(int nTry = 0; nTry < 5; nTry++)
{
SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds());
int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
SaveComment(strExpertName + ", error: " + nError);
}
bool bClosed = true;
for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--)
{
OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES);
if(OrderTicket() == nTicket)
{
bClosed = false;
break;
}
}
if(bClosed == true)
{
SaveComment("\r\n\tNo more orders with this ticket No");
break;
}
else
{
SaveComment("\r\n\tOrder with this ticket still present, trying again");
RefreshRates();
}
}
}
这是什么,如何处理?
当重新启动MT(关闭条件仍然有效)时,交易成功关闭。
日志中没有错误,文件中的输出,我按字面意思横放了一行,显示OrderSend 工作了,没有错误,但麻烦来了:a)开放列表中的订单仍然存在,b)它在MT重启时关闭,所以它不仅在列表中,而且在现实中。
以防Meta想与Alpari核对日志,账户142605,票据1728130
,我希望仍能得到答案,这不是我第一次发关于这个错误的帖子。
Regards,
Quark