回答お願いします。
現在トラリピ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); } } } }
あなたの回答
tips
プレビュー