我需要一个代码的帮助 - 页 4 12345 新评论 Daniel Petrovai 2014.03.09 03:01 #31 diamstar: 我看到右上角的d e a的名字,前面有一个x,而不是附加e a后的笑脸。 我确实输入了gmt的时间。 嗨,diamstar。首先你要明白,你在这里得到的代码是用于学习的。这意味着你以任何方式测试、修改或使用这些代码,风险自负。回到你的问题,如果你没有得到一个笑脸,请检查 专家顾问按钮。 如果它是红色的,就按下它。 此外,你可能需要检查MT4的设置。进入工具,选择选项(底部的最后一个)。如果它不像这样: 让它看起来像这样。现在应该可以工作了。记住,如果您想停止EA,只需按下专家顾问按钮。 你是否进行了任何回溯测试?时间应该是服务器时间。 [删除] 2014.03.09 09:19 #32 谢谢你。我现在看到了这个笑脸。我将在本周测试后向你更新。再次感谢你。 Daniel Petrovai 2014.03.10 01:15 #33 diamstar: 谢谢你。我现在看到了笑脸。我将在本周测试后向您更新。再次感谢。 你知道如何在策略测试器中 运行回测,是否可视,以及优化功能吗? 还是你很乐意在演示中进行测试?使用策略测试器找到最佳设置可能会更快更容易。 祝您好运 [删除] 2014.03.10 15:33 #34 我看到了笑脸,但订单仍然没有被激活。我检查了策略测试器 的日志,我看到订单结束错误130 Daniel Petrovai 2014.03.10 21:40 #35 diamstar :我看到了笑脸,但订单仍未激活。我检查了策略测试器的日志,我看到了 ordersend 错误 130您能否发布您正在使用的设置和图表时间范围?如果您需要对设置进行说明,请询问,没问题。这是一个稍微改进的版本,再次像往常一样用于学习目的。 //+------------------------------------------------------------------+ //| News_Trader_v1.mq4 | //| Copyright © 2013 _3DE | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2013 _3DE" #property link "http://www.metaquotes.net" extern string Note1 = "Set parameters in Pips not points !" ; extern string Note5 = "Set PeriodSignal in minutes!" ; extern string Note6 = "1=M1;5=M5;15=M15;30=M30;60=H1;240=H4;1440=D1!" ; extern int PeriodForSignal= 15 ; extern int TakeProfit = 25 ; // Take profit pips extern int StopLoss = 0 ; // Stop loss pips (manual trading) extern string Note4 = "Leave SetDistance to zero if trading news !" ; extern int SetDistance= 10 ; // Distance for BuyStop and SellStop from price at news time extern string Note2 = "Set day of the month for the news !" ; extern string Note3 = "Set to zero to trade every day at the same time !" ; extern int DayOfNews = 0 ; // Day of the month of news extern int NewsHour = 0 ; // Hour of news extern int NewsMin = 1 ; // Minute of news extern int Expiration= 600 ; // Expiration of pending orderes extern int BEPips = 0 ; // Move to break even after BEPips extern int TrailingStop= 0 ; // What distance to keep trailing extern int Slip = 5 ; // Slippage extern int MagicNumber= 2210 ; // Must be unique for every chart extern double Lots= 0.1 ; extern bool WriteLog= false ; // Write a log file extern string TradeLog = "MI_Log" ; input string EaComment = "NewsTrader_EA" ; double high_M1,low_M1,openPriceBuyStop,openPriceSellStop,slOpenBuyStop,slSellStop,tpOpenBuyStop,tpSellStop,spread,price; string filename; int pointMultiply= 10 ; double minDist= 0 ; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if (SetDistance== 0 )pointMultiply= 10 ; else {pointMultiply=SetDistance;} if ( Digits == 3 || Digits == 5 ) { pointMultiply *= 10 ; TakeProfit *= 10 ; StopLoss *= 10 ; BEPips *= 10 ; TrailingStop *= 10 ; SetDistance *= 10 ; } minDist= MarketInfo ( NULL , MODE_STOPLEVEL )* Point ; //---- return ( 0 ); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return ( 0 ); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int i; int OrdersCondition,minofday,minofnews; filename= Symbol ()+TradeLog+ "-" + Month ()+ "-" + Day ()+ ".txt" ; if (BEPips> 0 ) DoBE(BEPips); if (TrailingStop> 0 ) DoTrail(); OrdersCondition=CheckOrdersCondition(); if ( Day ()==DayOfNews || DayOfNews== 0 ) { minofday= Hour ()* 60 + Minute (); minofnews=NewsHour* 60 +NewsMin; if ((minofday==minofnews- 2 ) || (minofday==minofnews- 1 )) { high_M1= iHigh ( NULL ,PeriodForSignal, 0 ); low_M1= iLow ( NULL ,PeriodForSignal, 0 ); //--- Get the highest high and lowest low for the last 3 bars on 1 minute for (i= 1 ;i<= 3 ;i++) if ( iHigh ( NULL ,PeriodForSignal,i)>high_M1) high_M1= iHigh ( NULL ,PeriodForSignal,i); for (i= 1 ;i<= 3 ;i++) if ( iLow ( NULL ,PeriodForSignal,i)<low_M1) low_M1= iLow ( NULL ,PeriodForSignal,i); spread= Ask - Bid ; openPriceBuyStop= NormalizeDouble ((high_M1+spread+(pointMultiply* Point )), Digits ); slOpenBuyStop= NormalizeDouble (high_M1, Digits ); tpOpenBuyStop= NormalizeDouble ((openPriceBuyStop+(TakeProfit* Point )+spread), Digits ); if ((openPriceBuyStop-slOpenBuyStop)<minDist) { slOpenBuyStop= NormalizeDouble (openPriceBuyStop-minDist-spread, Digits ); } //--- openPriceSellStop= NormalizeDouble (low_M1-(pointMultiply* Point ), Digits ); slSellStop= NormalizeDouble (low_M1, Digits ); tpSellStop= NormalizeDouble ((openPriceSellStop-(TakeProfit* Point )-spread), Digits ); if ((slSellStop-openPriceSellStop)<minDist) { slSellStop= NormalizeDouble (openPriceSellStop+minDist+spread, Digits ); } //--- if (StopLoss> 0 &&SetDistance> 0 ) { price=( Ask + Bid )/ 2 ; high_M1=price+(SetDistance* Point ); low_M1=price-(SetDistance* Point ); openPriceBuyStop= NormalizeDouble (high_M1+spread, Digits ); slOpenBuyStop= NormalizeDouble (openPriceBuyStop-(StopLoss* Point ), Digits ); tpOpenBuyStop= NormalizeDouble (openPriceBuyStop+(TakeProfit* Point ), Digits ); if ((openPriceBuyStop-slOpenBuyStop)<minDist) { slOpenBuyStop= NormalizeDouble (openPriceBuyStop-minDist-(StopLoss* Point ), Digits ); Alert ( "Stop too close ! Check your StopLoss settitngs !!!" ); } openPriceSellStop= NormalizeDouble (low_M1-spread, Digits ); slSellStop= NormalizeDouble (openPriceSellStop+(StopLoss* Point ), Digits ); if ((slSellStop-openPriceSellStop)<minDist) { slSellStop= NormalizeDouble (openPriceSellStop+minDist+(StopLoss* Point ), Digits ); Alert ( "Stop too close ! Check your StopLoss settitngs !!!" ); } tpSellStop= NormalizeDouble (openPriceSellStop-(TakeProfit* Point ), Digits ); } if (OrdersCondition== 0 ) { if (WriteLog)Write( "Opening BuyStop & SellStop, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); OpenBuyStop(); OpenSellStop(); } if (OrdersCondition== 10 ) { if (WriteLog)Write( "Opening SellStop, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); OpenSellStop(); } if (OrdersCondition== 1 ) { if (WriteLog)Write( "Opening BuyStop , OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); OpenBuyStop(); } } } if ((minofday>=minofnews) && (minofday<=minofnews+Expiration- 1 )) { if (OrdersCondition== 1001 ) { if (WriteLog)Write( "Deleting SellStop Because of BuyStop Hit, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); DeleteSellStop(); } if (OrdersCondition== 110 ) { if (WriteLog)Write( "Deleting BuyStop Because of SellStop Hit, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); DeleteBuyStop(); } } if (minofday>=minofnews+Expiration) { if (OrdersCondition== 11 ) { if (WriteLog)Write( "Deleting BuyStop and SellStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); DeleteBuyStop(); DeleteSellStop(); } if ((OrdersCondition== 10 ) || (OrdersCondition== 110 )) { if (WriteLog)Write( "Deleting BuyStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); DeleteBuyStop(); } if ((OrdersCondition== 1 ) || (OrdersCondition== 1001 )) { if (WriteLog)Write( "Deleting SellStop Because 5 min expired, OrdersCondition=" +OrdersCondition+ " MinOfDay=" +minofday); DeleteSellStop(); } } //---- return ( 0 ); } //+------------------------------------------------------------------+ //| int CheckOrdersCondition() | //+------------------------------------------------------------------+ int CheckOrdersCondition() { int result= 0 ; for ( int i= 0 ;i< OrdersTotal ();i++) { OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); if (( OrderType ()== OP_BUY ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber)) { result+= 1000 ; } if (( OrderType ()== OP_SELL ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber)) { result+= 100 ; } if (( OrderType ()== OP_BUYSTOP ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber)) { result+= 10 ; } if (( OrderType ()== OP_SELLSTOP ) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==MagicNumber)) { result+= 1 ; } } return (result); // 0 means we have no trades } // OrdersCondition Result Pattern // 1 1 1 1 // b s bs ss // //+------------------------------------------------------------------+ //|void OpenBuyStop() | //+------------------------------------------------------------------+ void OpenBuyStop() { int ticket,tries; tries= 0 ; if (! GlobalVariableCheck ( "InTrade" )) { while (tries< 3 ) { GlobalVariableSet ( "InTrade" , TimeCurrent ()); // set lock indicator ticket= OrderSend ( Symbol (), OP_BUYSTOP ,Lots,openPriceBuyStop,Slip,slOpenBuyStop,tpOpenBuyStop,EaComment,MagicNumber, 0 ,Red); if (WriteLog)Write( "in function OpenBuyStop OrderSend Executed , ticket =" +ticket); GlobalVariableDel ( "InTrade" ); // clear lock indicator if (ticket<= 0 ) { tries++; } else tries= 3 ; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OpenSellStop() { int ticket,tries; tries= 0 ; if (! GlobalVariableCheck ( "InTrade" )) { while (tries< 3 ) { GlobalVariableSet ( "InTrade" , TimeCurrent ()); // set lock indicator ticket= OrderSend ( Symbol (), OP_SELLSTOP ,Lots,openPriceSellStop,Slip,slSellStop,tpSellStop,EaComment,MagicNumber, 0 ,Red); if (WriteLog)Write( "in function OpenSellStop OrderSend Executed , ticket =" +ticket); GlobalVariableDel ( "InTrade" ); // clear lock indicator if (ticket<= 0 ) { tries++; } else tries= 3 ; } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DoBE( int byPips) { for ( int i= 0 ; i< OrdersTotal (); i++) { OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber)) // only look if mygrid and symbol... { if ( OrderType ()== OP_BUY ) if ( Bid - OrderOpenPrice ()>byPips* Point ) if ( OrderStopLoss ()< OrderOpenPrice ()) { if (WriteLog)Write( "Movine StopLoss of Buy Order to BE+1" ); OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()+ Point , OrderTakeProfit (),Red); } if ( OrderType ()== OP_SELL ) if ( OrderOpenPrice ()- Ask >byPips* Point ) if ( OrderStopLoss ()> OrderOpenPrice ()) { if (WriteLog)Write( "Movine StopLoss of Buy Order to BE+1" ); OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()- Point , OrderTakeProfit (),Red); } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DoTrail() { for ( int i= 0 ; i< OrdersTotal (); i++) { OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber)) // only look if mygrid and symbol... { if ( OrderType ()== OP_BUY ) { if ( Bid - OrderOpenPrice ()> Point *TrailingStop) { if ( OrderStopLoss ()< Bid - Point *TrailingStop) { OrderModify ( OrderTicket (), OrderOpenPrice (), Bid - Point *TrailingStop, OrderTakeProfit (), 0 ,Green); return ; } } } if ( OrderType ()== OP_SELL ) { if (( OrderOpenPrice ()- Ask )>( Point *TrailingStop)) { if (( OrderStopLoss ()>( Ask + Point *TrailingStop)) || ( OrderStopLoss ()== 0 )) { OrderModify ( OrderTicket (), OrderOpenPrice (), Ask + Point *TrailingStop, OrderTakeProfit (), 0 ,Red); return ; } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DeleteBuyStop() { for ( int i= 0 ; i< OrdersTotal (); i++) { OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber) && ( OrderType ()== OP_BUYSTOP )) { OrderDelete ( OrderTicket ()); if (WriteLog)Write( "in function DeleteBuyStopOrderDelete Executed" ); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DeleteSellStop() { for ( int i= 0 ; i< OrdersTotal (); i++) { OrderSelect (i, SELECT_BY_POS , MODE_TRADES ); if ( OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==MagicNumber) && ( OrderType ()== OP_SELLSTOP )) { OrderDelete ( OrderTicket ()); if (WriteLog)Write( "in function DeleteSellStopOrderDelete Executed" ); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Write( string str) { int handle; handle= FileOpen (filename, FILE_READ | FILE_WRITE | FILE_CSV , "/t" ); FileSeek (handle, 0 , SEEK_END ); FileWrite(handle,str+ " Time " + TimeToStr ( CurTime (), TIME_DATE | TIME_SECONDS )); FileClose (handle); } //+------------------------------------------------------------------+ 我添加了 PeriodForSgnal 参数,因为之前只接收 1 分钟时间范围内的信号,现在您可以将其设置为 5、15、60 分钟,无论您想要交易新闻。当 StopLoss=0 时,它将为您计算止损。如果 SetDistance=0,它将计算挂单的距离。 [删除] 2014.03.11 19:09 #36 它成功了!!!。我今天能够进行一些反向测试,我在其中一个输入中犯了一个错误。我还是会在模拟账户 上进行一些测试。谢谢你一百万次。 Daniel Petrovai 2014.03.11 21:47 #37 diamstar: 它成功了!!!。我今天能够进行一些反向测试,我在其中一个输入中犯了一个错误。我还是会在模拟账户上尝试一些测试。谢谢你一百万次。 不客气。 很高兴看到你在学习。 如果你有任何其他问题,欢迎你提出。 [删除] 2014.04.01 15:22 #38 你好,E A在回溯测试 中工作正常,但在演示中不工作。我在网上看到的文章显示,订单发送和订单修改的发送方式不同。我不太明白这一点。谢谢 Daniel Petrovai 2014.04.05 03:10 #39 diamstar: 你好,这个EA在后面的测试中工作正常,但在演示中不工作。我在网上看到的文章显示,订单发送和订单修改的发送方式不同。我不太明白这一点。谢谢 嗨,diamstar。 很高兴听到你在学习。现在,你确定你说的是模拟账户而不是真实账户? 我知道有些经纪商不允许EA在真实账户上下带止损和止盈的 订单,所以 解决办法是修改EA,使其发送的订单的止损和获利均为零,然后使用另一个函数来修改 然后用另一个函数将止损和获利修改为你想要的任何值,但这也是针对真实账户而非模拟账户。 如果你说的情况发生在模拟账户上,你需要按下终端按钮,检查专家选项卡和日志选项卡,看看你是否在那里得到任何错误。 如果你确实得到任何错误信息,让我知道它们是什么。 在这样的小细节上很难猜到你想做什么,什么地方出错了。让我知道你是如何使用它的,你的止损点是什么,获利点,等等。 我正在努力改进这个EA,因为它显示了在正确的参数和正确的下单时间内取得良好结果的潜力。 只要你有兴趣,我就会随时向你汇报。 [删除] 2014.04.07 07:52 #40 谢谢你,这本书对理解代码有很大帮助。当我改变输入值时,它甚至在一个演示中完美地工作。当然,我也非常愿意学习。 12345 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我看到右上角的d e a的名字,前面有一个x,而不是附加e a后的笑脸。 我确实输入了gmt的时间。
嗨,diamstar。
首先你要明白,你在这里得到的代码是用于学习的。
这意味着你以任何方式测试、修改或使用这些代码,风险自负。
回到你的问题,如果你没有得到一个笑脸,请检查 专家顾问按钮。
如果它是红色的,就按下它。
此外,你可能需要检查MT4的设置。
进入工具,选择选项(底部的最后一个)。
如果它不像这样:
让它看起来像这样。
现在应该可以工作了。记住,如果您想停止EA,只需按下专家顾问按钮。
你是否进行了任何回溯测试?
时间应该是服务器时间。
谢谢你。我现在看到了笑脸。我将在本周测试后向您更新。再次感谢。
你知道如何在策略测试器中 运行回测,是否可视,以及优化功能吗?
还是你很乐意在演示中进行测试?使用策略测试器找到最佳设置可能会更快更容易。
祝您好运
我看到了笑脸,但订单仍未激活。我检查了策略测试器的日志,我看到了 ordersend 错误 130
您能否发布您正在使用的设置和图表时间范围?
如果您需要对设置进行说明,请询问,没问题。
这是一个稍微改进的版本,再次像往常一样用于学习目的。
我添加了 PeriodForSgnal 参数,因为之前只接收 1 分钟时间范围内的信号,现在您可以将其设置为 5、15、60 分钟,无论您想要交易新闻。
当 StopLoss=0 时,它将为您计算止损。如果 SetDistance=0,它将计算挂单的距离。
它成功了!!!。我今天能够进行一些反向测试,我在其中一个输入中犯了一个错误。我还是会在模拟账户上尝试一些测试。谢谢你一百万次。
不客气。
很高兴看到你在学习。
如果你有任何其他问题,欢迎你提出。
你好,这个EA在后面的测试中工作正常,但在演示中不工作。我在网上看到的文章显示,订单发送和订单修改的发送方式不同。我不太明白这一点。谢谢
嗨,diamstar。
很高兴听到你在学习。现在,你确定你说的是模拟账户而不是真实账户?
我知道有些经纪商不允许EA在真实账户上下带止损和止盈的 订单,所以
解决办法是修改EA,使其发送的订单的止损和获利均为零,然后使用另一个函数来修改
然后用另一个函数将止损和获利修改为你想要的任何值,但这也是针对真实账户而非模拟账户。
如果你说的情况发生在模拟账户上,你需要按下终端按钮,检查专家选项卡和日志选项卡,看看你是否在那里得到任何错误。
如果你确实得到任何错误信息,让我知道它们是什么。
在这样的小细节上很难猜到你想做什么,什么地方出错了。让我知道你是如何使用它的,你的止损点是什么,获利点,等等。
我正在努力改进这个EA,因为它显示了在正确的参数和正确的下单时间内取得良好结果的潜力。
只要你有兴趣,我就会随时向你汇报。