//+------------------------------------------------------------------+//| RSI_strategy_cyxstudio.mq4 |//| Copyright 2013, Tjipke de Vries |//| https://forum.mql4.com/53695/ |//+------------------------------------------------------------------+#property copyright "Copyright 2013, MetaQuotes Software Corp."#property link "http://www.metaquotes.net"externint RSIPeriod = 3; //number of periods for RSIexterndouble UpperBound = 90; //set upper bound value for RSIexterndouble LowerBound = 5; //set lower bound value for RSIexternint MASlowPeriod = 200;
externint MAFastPeriod = 5;
externdouble Lots = 0.1;
externdouble StopLoss = 60; //Set the stop loss levelexterndouble TakeProfit = 120; //Set the take profit levelexterndouble TrailingStop = 40;
//extra settings for OrderSendexternint MagicNumber = 54333;
externstring CommentEA = "RSI strategy";
externint Slippage.Pips = 3;
int BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.int pips2points; // slippage 3 pips 3=points 30=pointsdouble pips2dbl; // Stoploss 15 pips 0.015 0.0150intDigits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips)//---//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//---- if(Digits % 2 == 1) // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
{pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;}
else {pips2dbl = Point; pips2points = 1; Digits.pips = 0;}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //---- //----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----int Ticket;
double SL,TP;
int Total;
double MagicNo;
double Slippage;
double pAsk = MarketInfo(Symbol(), MODE_ASK);
double pBid = MarketInfo(Symbol(), MODE_BID);
double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Averagedouble CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
int Ticket2;
int cnt;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (OrdersTotal() == 0 ) {
if (CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry
Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy orderif(Ticket>0)
{
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
if (Ticket < 0) {
Print("Error opening BUY order : ",GetLastError());
return(0);
}
}
if (CurrentRSI > UpperBound && pBid < MA200) { //Condition to execute sell entry
Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow) ; //execute sell orderif(Ticket2>0)
{
if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
if (Ticket2<0) {
Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
}
if (OrdersTotal() > 0 ) {
int PositionIndex; // <-- this variable is the index used for the loopint TotalNumberOfOrders; // <-- this variable will hold the number of orders currently in the Trade pool
TotalNumberOfOrders = OrdersTotal(); // <-- we store the number of Orders in the variablefor(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO !
{
RefreshRates();
if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndexif( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ?
&& OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ?
&& ( OrderType() == OP_BUY // <-- is the Order a Buy Order ?
|| OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ?if (pAsk > MA5){ //condition to close long position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long positionreturn(0); // exitif(TrailingStop>0)
{
if(pBid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<pBid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
if(pBid < MA5){ //condition to close short position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short positionreturn(0); // exitif(TrailingStop>0)
{
if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
{
if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) ) // <-- try to close the orderPrint("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() ); // <-- if the Order Close failed print some helpful information
} // end of For loop
}
return(0);
}
当你启动你的Metatrader时,EA必须找出是否有一笔交易。
如果有交易,我只做了检查交易的循环倒计时。
如果我在一开始就把它设置为1,并且OrdersTotal()>0,那么我就让它检查交易,如果(.......> ||.......> ){做循环....
你确定你给了我上面显示的结果的代码吗? 我在1440(1天)期间进行了测试,没有执行任何交易,但当我把它改为1M时,许多交易被执行。
好了,在这里.....,如果我可以的话,我将尝试在这里提供帮助。
这个Ma_Shift问题是我有过的一个问题,但一直无法得到明确的答案。
如果你注意到在你的代码中,你在你的移动平均数上使用了一个8的移位....,这是什么意思?
这使得08:00的蜡烛值有3个点的差异,在数据窗口中显示。

这就给我们带来了一个问题:最后的 "移位 "设置是用来干什么的?
当你打开数据窗口,把鼠标移到你的图表上,从一个蜡烛移到另一个蜡烛时
你会看到5SMA的数字随着你从一个蜡烛到另一个蜡烛而变化......。
这就是最后一个SHIFT值的作用......请记住,目前正在绘制的蜡烛是零号蜡烛。
牢记当前正在绘制的蜡烛是零号蜡烛......最后完成的 蜡烛是一号蜡烛,所以如果你的图表上共有1000根蜡烛
所以,如果你的图表上有1000根蜡烛,它们的编号是从你的图表左边缘的999到你目前所在的0。
因此,如果您想知道5根蜡烛之前的5SMA的值是多少?
你就在最后一个位置放一个5......当然随着时间的推移......蜡烛5会变成下一个蜡烛。
如前所述,如果你总是得到蜡烛0的值,那么这个值就会不断地
随着价格的变化而变化。所以你可能会得到一个信号,然后指标就会重新显示出来。
总是要求得到蜡烛1的信息,那么它就已经完成了,不会改变....。
我希望这有帮助...
我已经重新做了所有的事情,修复了循环,滑移,修复了移动平均线和RSI值,确保在开始新的头寸之前关闭所有已开的头寸。但当我回测时,什么都没有发生,没有执行买入/卖出...它的问题是什么?
init()函数只在启动时运行,而不是像start()函数那样在每个tick 上运行。你需要把移动平均数放回start函数中,而不是放在init()函数中,这样它才能工作,以便不断获得新的数字...
重做了
增加一个功能,在决定开新仓之前,EA会检查是否有任何挂单。如果有一个挂单或已开的订单,那么它就不会再尝试开仓。
我看到每个人在买入前都会使用一个循环来检查是否有未结头寸,我看不出其中的逻辑。只要OrdersTotal>0,就有未结订单,我的EA就不会寻求开更多的头寸。
修正了递减循环。
这次它给了我OrderClose错误138,这不能通过添加refreshrates()来解决。
而且我还是以亏损告终,我不应该这样做。
我想不出还有什么可以解决的......
重做了
增加一个功能,在决定开新仓之前,EA会检查是否有任何挂单。如果有一个挂单或已开的订单,那么它就不会再尝试开仓。
我看到每个人在买入前都会使用一个循环来检查是否有未结头寸,我看不出其中的逻辑。只要OrdersTotal>0,就有未结订单,我的EA就不会寻求开更多的头寸。
修正了递减循环。
这次它给了我OrderClose错误138,这不能通过添加refreshrates()来解决。
而且我还是以亏损告终,我不应该这样做。
我想不出还有什么可以解决的......
为什么你在检查 你的EA在你的账户上所开的交易之前,要把开仓买入的逻辑放在?????
现在会发生什么????,你到目前为止的编程?
假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。
该交易的OrdersTotal()有多少笔?
您的代码....,用于购买
它现在在做什么?它这样做的原因是什么?
为什么你在检查你的EA在你的账户上所开的交易之前,就把开仓买入的逻辑放在????。
现在会发生什么????,你到目前为止的编程?
假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。
该交易的OrdersTotal()有多少笔?
您的代码....,用于购买
它现在在做什么?它这样做的原因是什么?
只有在满足买入条件和没有开仓的情况下才买入。
只有在满足买入条件和没有开仓的情况下才会买入。
假设你有一个使用你的EA的账户。你手动开了一笔英镑兑美元的交易。
该条件是否为真
你能让我看看你的代码吗?
我想知道为什么我失败了,以及如何得到它。
.
你给我的信息,我可以直接给你完整的代码.....。
这不是免费的,你必须使用"工作"部分并付费才能得到它...
你会在那里得到它
.
另一个方法是好好阅读你的主题
我们在这里帮助你学习如何自己编程,这是免费帮助。
我们向你展示你的错误并帮助你解决。
当你学会了如何写代码的时候,我就会展示我的代码....。
那就不需要付钱了,你可以在那一刻把它和你在这个论坛的帮助下编写的代码进行比较。
....
我的最后一个问题仍未得到回答
假设你有一个使用你的EA运行的账户。你手动开了一笔英镑兑美元的交易。
该条件是否为真?
.
.在另一个话题OrderClose错误138
你在那里得到了很好的帮助(RaptorUK和WHRoeder 感谢你的解释,我认为做得很好)。
.
我想问的另一个问题是
为什么你在计算移动平均线时改变了时间框架?
这和我给的不一样。
它没有在其他图表上计算出正确的值 每日
.
所以要花时间学习和练习,并仔细阅读本论坛上的帮助。
或者你花钱请人在像Jobs 这样的网站上为你编程。
你能让我看看你的代码吗?
我想知道为什么我失败了,以及如何得到它。
.
你给我的信息,我可以直接给你完整的代码.....。
这不是免费的,你必须使用"工作"部分并付费才能得到它...
你会在那里得到它
.
另一个方法是好好阅读你的主题
我们在这里帮助你学习如何自己编程,这是免费帮助。
我们向你展示你的错误并帮助你解决。
当你学会了如何写代码的时候,我就会展示我的代码....。
那就不需要付钱了,你可以在那一刻把它和你在这个论坛的帮助下编写的代码进行比较。
....
我的最后一个问题仍然没有得到回答
假设你有一个使用你的EA运行的账户。你手动开了一笔英镑兑美元的交易。
该条件是否为真?
.
.在另一个话题OrderClose错误138
你在那里得到了很好的帮助(RaptorUK和WHRoeder 感谢你的解释,我认为做得很好)。
.
我想问的另一个问题是
为什么你在计算移动平均线时改变了时间框架?
这和我给的不一样。
它没有在其他图表上计算出正确的值 每日
.
所以要花时间学习和练习,并仔细阅读本论坛上的帮助。
或者你花钱请人在像Jobs 这样的网站上为你编程。
OrdersTotal() 是否应该显示挂单和市价订单的总量,无论它们是通过EA还是手动打开的?
我是这样想的。我的EA会一直检查是否有未结订单,如果有,它就不会再打开订单,只有在没有未结订单时才会打开新订单。
我认为它工作得很好,因为我的结果部分显示了订单序列1,1,2,2,3,3,4,4,这意味着在新的订单被打开之前,一个订单被关闭。
由于测试原因,移动平均线和RSI的变量发生了变化。我在不同的时间框架/周期上进行了实验,但在这里发布时没有改回来。
最奇怪的是,我的代码只执行买入订单,它从未执行过哪怕一个......卖出订单。
简而言之,我现在仍然面临的问题。
1.它只执行买入,但从不执行卖出,尽管我已经编了卖出的代码
2.仍然在赚取负利润,我相信这个策略不应该是这样的。