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

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

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

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

Q&A

0回答

1994閲覧

トラリピEA 注文LOT数 トラップ幅について

mu-gen

総合スコア10

MQL4

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

0グッド

0クリップ

投稿2018/10/06 05:06

回答お願いします。
現在トラリピEAを運用しようと思っていますが、LOT数とトラップ幅を毎回固定ではなく1回目は0.5LOT
2回目は1LOT トラップ幅も最初は50PIPS2回目は60PIPSに変更したいのですが 決済方法も同じように
変更は可能ですか?よろしくお願いいたします。

//+---------------------------------------------------------------------+
// パラメーター設定
//+---------------------------------------------------------------------+

extern string C0="---- Base Setting ----";
extern int MAGIC = 2;
extern int Slippage=3;

extern int Direction=2; //2_ハーフ&ハーフ(上方売り,下方買い),0_注文キャンセル,-99_全決済

extern double RangeMax=1.40;
extern double RangeMin=1.00;
extern int StepPips=50;
extern int OrderRange=100;//pips
extern double rangeHalf=1.9000000000000012;//ハーフ&ハーフ中央値

//取引ロット関連
extern double BaseLots=0.50;
extern int takeprofit=50;
extern int stoploss=0;

//その他項目
double Lots;

extern string C1="";

//+---------------------------------------------------------------------+
// 一般関数
//+---------------------------------------------------------------------+

double AdjustPoint(string Currency)//ポイント調整
{
int Symbol_Digits=MarketInfo(Currency,MODE_DIGITS);
double Calculated_Point=0;
if (Symbol_Digits==2 || Symbol_Digits==3)
{
Calculated_Point=0.01;
}
else if (Symbol_Digits==4 || Symbol_Digits==5)
{
Calculated_Point=0.0001;
}
return(Calculated_Point);
}

double AdjustSlippage(string Currency,int Slippage_pips )//スリッページ調整
{
double Calculated_Slippage;
int Symbol_Digits=MarketInfo(Currency,MODE_DIGITS);
if (Symbol_Digits==2 || Symbol_Digits==3)
{
Calculated_Slippage=Slippage_pips;
}
else if (Symbol_Digits==4 || Symbol_Digits==5)
{
Calculated_Slippage=Slippage_pips*10;
}
return(Calculated_Slippage);
}

double AdjustValByPips(double BeforeAdjustVal)
{
double Num=0;
double ret=0;
Num=MathRound( (BeforeAdjustVal-RangeMin) / (StepPipsAdjustPoint(Symbol())) );
ret=RangeMin+(Num
(StepPips*AdjustPoint( Symbol() ) ) );
return (ret);
}
int LongPosition()//ロングポジション数を取得
{
int buys=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_BUY) buys++;
}
}
return(buys);
}

int ShortPosition()//ショートポジション数を取得
{
int sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_SELL) sells++;
}
}
return(sells);
}

int LongOrder()//ロング注文数を取得
{
int buys=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP) buys++;
}
}
return(buys);
}

int ShortOrder()//ショートオーダー数を取得
{
int sells=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
{
if(OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP ) sells++;
}
}
return(sells);
}

//+---------------------------------------------------------------------+
// エグジット関連関数
//+---------------------------------------------------------------------+

//ポジションクローズ関数
void CloseOrder(int ClosePosition)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MAGIC && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL && ClosePosition!=1) //売りポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
else if(OrderType()==OP_BUY && ClosePosition!=-1) //買いポジションのクローズ
{
res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10,Silver);
}
}
}
}
}

//オーダーキャンセル関数
void CancelOrder(int CancelPosition)
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
int res;
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
if(OrderMagicNumber()==MAGIC && OrderSymbol()==Symbol())
{
if( (OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) && CancelPosition==-1) //売りオーダーのキャンセル
{
res=OrderDelete(OrderTicket(),Silver);
}
else if( (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP) && CancelPosition==1) //買いオーダーのキャンセル
{
res=OrderDelete(OrderTicket(),Silver);
}
}
}
}

//各種パラメーター取得 // ニューバーの発生直後以外は取引しない if(Volume[0]>1) return; int EntryBuy=0; int EntrySell=0; int ExitBuy=0; int ExitSell=0; int LongNum=LongPosition(); int ShortNum=ShortPosition(); int LongOrderNum=LongOrder(); int ShortOrderNum=ShortOrder(); double lastValue=iClose(NULL,0,1); if(Direction==2) { if(lastValue>rangeHalf) { EntrySell=1; } else { EntryBuy=1; } } //クローズロジックは選択されていません //クローズ判定 //買いのクローズロジックは選択されていません //売りのクローズロジックは選択されていません int Strtagy=0; if (EntryBuy==1) Strtagy=1 ; if (EntrySell==1) Strtagy=-1 ; //方向が違う場合にはポジション決済 if (LongNum!=0 && (EntrySell==1 || Strtagy==-99 || Direction==-99 ) ) { CloseOrder(1); LongNum=LongPosition(); } if (ShortNum!=0 && ( EntryBuy==1 || Strtagy==-99 || Direction==-99 ) ) { CloseOrder(-1); ShortNum=ShortPosition(); } //エントリ方向又はフィルターとトラップの向きが違う場合は全注文キャンセル if (LongOrderNum!=0 && EntrySell==1 ) { CancelOrder(1); LongOrderNum=0; } if (ShortOrderNum!=0 && EntryBuy==1 ) { CancelOrder(-1); ShortOrderNum=0; } if (LongNum!=0 && Strtagy==-1) { CancelOrder(1); LongOrderNum=0; } if (ShortNum!=0 && Strtagy==1) { CancelOrder(-1); ShortOrderNum=0; } if (Strtagy==0 && (LongOrderNum!=0 || ShortOrderNum!=0) ) { CancelOrder(1); LongOrderNum=0; CancelOrder(-1); ShortOrderNum=0; } //注文がレンジ範囲外の場合にはトラップを範囲外のトラップをキャンセル double OrderRangeMin; double OrderRangeMax; double CurrentPrice; if (EntryBuy==1) CurrentPrice=Bid; if (EntrySell==1) CurrentPrice=Ask; OrderRangeMin=CurrentPrice-(OrderRange*0.5)*AdjustPoint(Symbol()); OrderRangeMax=CurrentPrice+(OrderRange*0.5)*AdjustPoint(Symbol()); int res; int i; for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if( (OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP) && ( (RangeMin>OrderOpenPrice() || OrderOpenPrice()>RangeMax ) || (OrderRangeMin>OrderOpenPrice() || OrderOpenPrice()>OrderRangeMax ) ) )//売りオーダーのキャンセル { res=OrderDelete(OrderTicket(),Silver); ShortOrderNum=ShortOrderNum-1; } else if( (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP) && ( (RangeMin>OrderOpenPrice() || OrderOpenPrice()>RangeMax ) || (OrderRangeMin>OrderOpenPrice() || OrderOpenPrice()>OrderRangeMax ) ) ) //買いオーダーのキャンセル { res=OrderDelete(OrderTicket(),Silver); LongOrderNum=LongOrderNum-1; } } } //ロットサイズ調整 Lots=BaseLots;//固定ロット // //トラップを張る // int SLP=AdjustSlippage(Symbol(),Slippage ); double OrderPrice; double TP; int size=0; double rangeArray[]; double positionArray[]; //オーダー範囲内の金額を配列に記録 for(i=0; RangeMax>RangeMin+((StepPips*i)*AdjustPoint(Symbol())); i++ ) { OrderPrice=RangeMin+((StepPips*i)*AdjustPoint(Symbol())); if (OrderRangeMin<OrderPrice && OrderPrice<OrderRangeMax ) { size=ArraySize(rangeArray)+1; ArrayResize(rangeArray,size); rangeArray[size-1]=OrderPrice; } } //注文ずみを配列に記録 for(i=0;i<=OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC && OrderCloseTime()==0 ) { size=ArraySize(positionArray)+1; ArrayResize(positionArray,size); if(EntryBuy==1) positionArray[size-1]=AdjustValByPips(OrderOpenPrice()); if(EntrySell==1) positionArray[size-1]=AdjustValByPips(OrderOpenPrice()); } } //オーダー範囲内にあるのにpositionがない場合に注文追加 double search; int ret; for(i=0;i<ArraySize(rangeArray)+1;i++) { search=AdjustValByPips(rangeArray[i]); ret=0; for(int j=0;j<=ArraySize(positionArray)+1;j++) { if (positionArray[j]==search && ret==0) { ret=1; break; } } if (ret==0) { OrderPrice=search; if (EntryBuy==1 && Strtagy==1 ) { TP=OrderPrice+(takeprofit*AdjustPoint(Symbol())); if (OrderPrice<Bid ) { //指値 res=OrderSend(Symbol(),OP_BUYLIMIT,Lots ,OrderPrice,SLP,0,TP,NULL,MAGIC,0,Red); } else { //逆指値 res=OrderSend(Symbol(),OP_BUYSTOP,Lots ,OrderPrice,SLP,0,TP,NULL,MAGIC,0,Red); } } if (EntrySell==1 && Strtagy==-1 ) { TP=OrderPrice-(takeprofit*AdjustPoint(Symbol())); if (OrderPrice>Ask) { //指値 res=OrderSend(Symbol(),OP_SELLLIMIT,Lots ,OrderPrice,SLP,0,TP,NULL,MAGIC,0,Red); } else { //逆指 res=OrderSend(Symbol(),OP_SELLSTOP,Lots ,OrderPrice,SLP,0,TP,NULL,MAGIC,0,Red); } } } }

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

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

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

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

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

y_waiwai

2018/10/06 05:16

ソースコードは、<code>ボタン、’’’の枠の中に貼り付けてください
mu-gen

2018/10/06 05:18

分りました。今修正して投稿しなおします。
y_waiwai

2018/10/06 05:20

ご協力お願いします。見やすくしたほうが回答も付きやすいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問