質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

0回答

573閲覧

MQLプログラミング、EA作成についての疑問。コードの組み込み方について。

mimi0000

総合スコア18

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2019/01/14 04:22

編集2019/01/14 04:25

前提・実現したいこと

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-Point
TrailingStop,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+Point
TrailingStop,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++をかじりはじめたばかりです。

いろいろ、見苦しいコードではありますが、回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問