//+------------------------------------------------------------------+//| 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);
}
メタトレーダー起動時にEAがトレードの有無を確認する必要があります。
トレードがある場合はトレードをチェックするためのカウントダウンのループだけをしています。
最初に1回でOrdersTotal()>0に設定したら、トレードをチェックさせる if(......> || ......> ){ループをする。
上記のような結果をもたらしたコードを私にくれたのは確かですか? 1440(1日)の期間でテストしましたが、取引は成立しませんでした。しかし、1Mに変更すると、多くの取引が成立しました。
さて、ここからが本題です......できることならここでお役に立ちたいと思います。
このMa_Shiftの質問は、私が以前から持っていたもので、明確な答えを得ることができなかったものです。
あなたのコードでは、移動平均のシフトを8にしていますが、これはどういう意味ですか?
これは、データ・ウィンドウに示されているように、この08:00のローソク足の値に3ピップの差を生じさせます。

では、最後の "Shift "は何のためにあるのでしょうか?
データ・ウィンドウを開いたままチャートの上をマウスで移動し、ローソク足からローソク足へ移動すると
ローソク足からローソク足へと移動するにつれて、5SMAの数値が変化していくのがわかると思います...。
これが最後のSHIFTの値です...現在描かれているローソクは0本目であることに留意してください。
最後に完成した ローソク足がローソク足1なので、1000本のローソク足があるとして
チャートの左端にある999から、現在いる0まで逆順に番号が振られます。
つまり、5本前の5SMAの値を知りたければ、その最後の場所に5をつける。
もちろん、時間が経つにつれて、5本目のロウソクは次のロウソクに変わります。
今述べたように、もしあなたが常にローソク足0の値を取得しているなら、その値は常に価格によって変化しています。
価格と一緒に変化しています。だから、あなたは信号を取ると、インジケータがあなたに再描画されることがあります...しかし、あなたがいる場合
常にキャンドル1からの情報を求めている場合、それは行われており、変更されません....
私はこれが役立つことを願っています...
私はすべてをやり直し、ループ、スリッページを修正し、移動平均とRSIの値を修正し、すべてのオープンポジションが新しいポジションを開始する前にクローズされることを確認しました。しかし、私はそれをバックテストするとき、何も起こりません、買い/売りは実行されていません。
init()関数は起動時のみ実行され、start()関数のように毎ティック 実行されるわけではありません。
リペア済み
EAが新しいポジションを開くことを決定する前に、保留中の注文が あるかどうかをチェックする機能を追加する。もし、未決済の注文があれば、それ以上オープンしようとしない。
OrdersTotalが> 0である限り、未決済の注文があり、私のEAはそれ以上のポジションを開こうとしません。
減少ループを修正しました。
今度はOrderCloseエラー138が発生し、これはrefreshrates()を追加しても解決できません。
そして、私はまだ私がそうであってはならないお金を失うことになる。
他に修正する方法が思いつかないのですが・・・。
リペア済み
EAが新しいポジションを開くことを決定する前に、保留中の注文があるかどうかをチェックする機能を追加する。もし、未決済の注文があれば、それ以上オープンしようとしない。
OrdersTotalが> 0である限り、未決済の注文があり、私のEAはそれ以上のポジションを開こうとしません。
減少ループを修正しました。
今度はOrderCloseエラー138が発生し、これはrefreshrates()を追加しても解決できません。
そして、私はまだ私がそうであってはならないお金を失うことになる。
他に修正する方法が思いつきません...。
なぜ、自分の口座でEAが開いている取引を確認 する前に、買いを開くロジックを配置したのですか?
今までのプログラミングではどうなるのでしょうか?
EAが稼働している口座があるとします。あなたはGBPUSDの取引を手動で開いたとします。
その取引でOrdersTotal()は何回取引されていますか?
あなたのコード......BUYの場合
これは今何をして いるのでしょうか?
なぜ、EAが自分の口座で開いている取引を確認する前に、買いを開くロジックを配置したのでしょうか?
今までのプログラミングではどうなるのでしょうか?
EAが稼働している口座があるとします。あなたはGBPUSDの取引を手動で開いたとします。
その取引でOrdersTotal()は何回取引されていますか?
あなたのコード......BUYの場合
これは今何をして いるのでしょうか?
買いの条件が満たされ、かつポジションが開設されていない場合にのみ買う。
買いの条件が満たされ、かつポジションが開設されていない場合のみ、買います。
あなたがEAで稼動している口座を持っていると仮定します。GBPUSDの取引を手動で開始します。
この場合、条件は真になりますか?
あなたのコードを拝見させていただけませんか?
なぜ失敗したのか、どうすればうまくいくのか知りたいです。
.
あなたのメッセージは、私が直接あなたに完全なコードを与えることができます.......
そのためにはジョブズ セクションを利用し、お金を払う必要があります。
あなたはそれをそこに取得します。
.
もう一つの方法は、あなたのトピックをよく読むことです。
私たちは、あなたが自分でプログラミングする方法を学ぶのを手伝っています。 これは無料のヘルプです。
我々は、あなたのエラーを表示し、解決する方法の方向にあなたを助ける。
私はあなたがそれを記述する方法を学んだ瞬間に私が持っているコードを表示する....
その後、支払う必要はありませんし、その瞬間は、このフォーラムの助けを借りて、ここで作ったコードでそれを比較することができます
....
ここで私の最後の質問はまだ答えていない
あなたがあなたのEAで実行されているアカウントを持っていると仮定します。あなたはGBPUSDのために手動で取引を開く。
条件は真になるのでしょうか?
.
.他のトピックでOrderClose error 138
あなたは非常によくそこに助けられている(RaptorUKとWHRoederは 、私は非常によくやったと思うそこに説明をありがとうござい ました)。
.
私はあなたのために持っている別の質問は次のとおりです。
なぜあなたは、この計算移動平均のTimeframeを変更しました
これは、私が与えたのと同じではありません。
他のチャートでは正しい値が計算されません。
.
だから、時間をかけて学習し、練習して、このフォーラムでここに得る助けを注意深く読んでください。
または、ジョブズの ようなサイトであなたのためにプログラミングするために誰かを支払う
あなたのコードを拝見させていただけませんか?
なぜ失敗したのか、どうすればうまくいくのか知りたいです。
.
あなたのメッセージは、私が直接あなたに完全なコードを与えることができます.......
そのためにはジョブズ セクションを利用し、お金を払う必要があります。
あなたはそれをそこに取得します。
.
もう一つの方法は、あなたのトピックをよく読むことです。
私たちは、あなたが自分でプログラミングする方法を学ぶのを手伝っています。 これは無料のヘルプです。
我々は、あなたのエラーを表示し、解決する方法の方向にあなたを助ける。
私はあなたがそれを記述する方法を学んだ瞬間に私が持っているコードを表示する....
その後、支払う必要はありませんし、その瞬間は、このフォーラムの助けを借りて、ここで作ったコードでそれを比較することができます
....
ここで私の最後の質問はまだ答えていない
あなたがあなたのEAで実行されているアカウントを持っていると仮定します。あなたはGBPUSDのために手動で取引を開く。
条件は真になるのでしょうか?
.
.他のトピックでOrderClose error 138
あなたは非常によくそこに助けられている(RaptorUKとWHRoederは 、私は非常によくやったと思うそこに説明をありがとうござい ました)。
.
私はあなたのために持っている別の質問は次のとおりです。
なぜあなたは、この計算移動平均のTimeframeを変更しました
これは私が与えたのと同じではありません。
他のチャートでは正しい値が計算されません。
.
だから、時間をかけて学習し、練習して、このフォーラムでここに得る助けを注意深く読んでください。
または、ジョブズの ようなサイトであなたのためにプログラミングするために誰かを支払う
OrdersTotal()は、EAや手動で開いたものに関わらず、保留中の注文や成行注文の合計金額を明らかにするものなのでしょうか?
私はこのように考えていました。私のEAは常に未決済注文があるかどうかをチェックし、もしあればそれ以上注文を出さず、未決済注文がないときのみ新規注文を出します。
結果欄には1,1,2,2,3,3,4,4という注文順序が表示されているので、うまくいっていると思うのですが、これは新しい注文が開かれる前に注文が閉じられていることを意味します。
移動平均とRSIの変数はテストのために変更されました。私は別の時間枠/期間で実験していましたが、ここに投稿するときに元に戻していません。
そして最も奇妙なのは、私のコードは買い注文しか実行されないということです。
簡単に言うと、私が今直面している問題です。
1.売りのコードを書いたのに、買いしか実行されず、売りが実行されない。
2.このストラテジーが想定していないマイナス利益を出している。