前提・実現したいこと
MQLのEAコード、
移動平均線のパーフェクトオーダーによる取引のコードに既存のトレイリングストップコードを追加したいですが、
どこに追加していいのか、わかりません。初心者です。
発生している問題・エラーメッセージ
コンパイルは警告なしで通ります。
バックテストについては、エラーはでませんが、
モデリング品質と、PF,勝率は惨憺たる結果になります。
該当のソースコード
MQL
プログラミングです。
ソースコード
トレイリングストップのコードです。
このコードを、下記のパーフェクトオーダーEAのコードに組み込む予定です。
void MoveTrailingStop()
{
int cnt,total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY)
{
if(TrailingStop>0)
{
if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-PointTrailingStop,Digits))||(OrderStopLoss()==0))
{
bool Modified=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-PointTrailingStop,Digits),OrderTakeProfit(),0,Blue);
return;
}
}
}
else if(OrderType()==OP_SELL)
{
if(TrailingStop>0)
{
if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+PointTrailingStop,Digits)))||(OrderStopLoss()==0))
{
bool Modifed =OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+PointTrailingStop,Digits),OrderTakeProfit(),0,Red);
return;
}
}
}
}
}
}
作成したベースコードです。
移動平均線のパーフェクトオーダーでの取引EAです。
//足一本だけでエントリー
extern bool Per1Bar=true;
int PrvBars = 0;
int currentBars = Bars;
extern int MAGIC =123;
extern int Slpips=200;
extern int Tppips=400;
int OnInit()
{
//---
int prvBars=currentBars;
//---
return(INIT_SUCCEEDED);
}
void OnTick()
{
//一本の足で一回だけエントリーさせる仕掛け。
if(Per1Bar){
//新しい足を生成したときでないとエントリーしない。
if(Bars==PrvBars){
PrvBars=currentBars;
return;
}
}
//EMA
double EMA1=iMA(NULL,PERIOD_M5,25,0,MODE_EMA,PRICE_CLOSE,1);
double EMA2=iMA(NULL,PERIOD_M5,75,0,MODE_EMA,PRICE_CLOSE,1);
double EMA3=iMA(NULL,PERIOD_M5,200,0,MODE_EMA,PRICE_CLOSE,1);
//perfect種別。
int PerfectSell=0;
int PerfectBuy=0;
//買い
if(EMA1 > EMA2 && EMA2 > EMA3 )PerfectBuy=1;
//売り
if(EMA1 < EMA2 && EMA2 < EMA3 )PerfectSell=1;
int OrdersTotal_=OrdersTotal();
for( int i=0;i<OrdersTotal_;i++)
{
bool Closed=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC)break;
if( OrderType() == OP_BUY && PerfectBuy==0 && Close[3] < EMA1 )
{
Closed = OrderClose(OrderTicket(),OrderLots(),Bid,3,clrYellow);
}
if( OrderType() == OP_SELL && PerfectSell==0 && Close[3] > EMA1 )
{
Closed = OrderClose(OrderTicket(),OrderLots(),Ask,3,clrOrange);
}
}
if( OrdersTotal() <3)
{
if(PerfectBuy==1 && Close[1] > EMA1 )
{
int Ticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-(SlpipsPoint),Ask+(TppipsPoint),"PerfectBUY",MAGIC,0,clrRed);
PrvBars=currentBars;
}
else if( PerfectSell==1 && Close[1] < EMA1 )
{
int Ticket = OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Bid+(SlpipsPoint),Bid-(TppipsPoint),"PerfectSELL",MAGIC,0,clrBlue);
PrvBars=currentBars;
}
}
}
試したこと
上記のトレイディングストップのコードを、
下記のEAに組み込みたいのですが、
実動関数のなかに組み込めばいいのか、
グローバル領域のextern関数の下あたりに組み込めばいいのか、悩んでいます。
ここに問題に対して試したことを記載してください。
いちよう、実働関数の、OrderSend関数の下に、Modify関数が来るように組み込んでみたり、
OrderClose関数をModify関数の入っているスコープのなかに組み込んでみたり、
いろいろやってみたのですが、初心者で、身近に聞ける人もいませんし、調べても、
基本トレイリングストップ関数しかでてこなくて、どう組み込んだらいいのかはでてこないので、正しいことをしているのか、とんちんかんなことをしているのか、困っています。
補足情報(FW/ツールのバージョンなど)
使っているのは、FXCMのデモ口座のメタエディタです。
追加質問:
ベースコードですが、プロの方からみれば、ひどいものだと思います。
もし、システム上、バックテストで問題が起こる可能性、正常にOrderできない状況になる
可能性があれば、その箇所も教えていただけると、助かります。
ここにより詳細な情報を記載してください。
私は初心者です。IT知識が無知の状態で、MQLを勉強しはじめました。
MQLの簡易的な部分は、勉強していますが、ほかは、C++をかじりはじめたばかりです。
いろいろ、見苦しいコードではありますが、回答よろしくお願いします。
あなたの回答
tips
プレビュー