MQL4 有効証拠金でエントリーするを実装

MQL4でFX自動システムを作っています。

実現したいこと

エントリーをする時にロット数でエントリーするのではなく、
有効証拠金が〇〇円だったら〇〇ロットでエントリーをする。とう言うのをつけたいです。
パラメーターで変更可能にしたいです。

有効証拠金が増えるたびにロット数が変更する感じにしたいです。


有効証拠金が10万円でしたら、1ロットでエントリー。
利確後11万円で1.1ロットでエントリーする。

該当のソースコード

#property strict

extern int magic=1;

extern double lots=0.01;

extern double slippage=3;

extern int fast=9;

extern int slow=17;

extern double nampin=300;

extern int maxnampin=10;

extern int rieki=1000;

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

extern string RSI_Config="RSI設定"; // RSI設定
extern bool RSI_Use = true ; // フィルター利用
extern int RSI_Period=14; // RSI期間
extern double RSI_BuyOpen = 30; // 買いエントリー閾値
extern double RSI_SellOpen = 70; // 売りエントリー閾値

bool rsi(int shift=0, int timeframe=0){
double rsi=iRSI(NULL,timeframe,RSI_Period,PRICE_CLOSE,shift);

if(RSI_BuyOpen > rsi) return true; else if(RSI_SellOpen < rsi) return true; return false;

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{
if( AccountNumber() != 252057445)
{
Comment("口座認証されていません");
return(0);
}

Comment("認証済口座");

//----

int cnt; int CurrentPosition; int Ticket; double profit; CurrentPosition=-1; for(cnt=0;cnt<OrdersTotal();cnt++) { if(OrderSelect(cnt,SELECT_BY_POS)==false)continue; if(OrderMagicNumber()!=magic)continue; profit=profit+OrderProfit(); if(OrderMagicNumber()==magic)CurrentPosition=cnt; } if(CurrentPosition==-1) { if(MAcross(fast,slow)==1 && rsi() == 1) { Ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,0,0,"buy",magic,0,Blue); } if(MAcross(fast,slow)==2 && rsi() == 2) { Ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,0,0,"sell",magic,0,Red); } } else { OrderSelect(CurrentPosition,SELECT_BY_POS); if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(OrdersTotal()<(maxnampin+1)&&Close[0]<(OrderOpenPrice()-nampin*Point)) { Ticket=OrderSend(Symbol(),OP_BUY,OrderLots()*3,Ask,slippage,0,0,"buy2",magic,0,Blue); } if(profit>rieki) { allClose(Green); } } if(OrderType()==OP_SELL) { if(OrdersTotal()<(maxnampin+1)&&Close[0]>(OrderOpenPrice()+nampin*Point)) { Ticket=OrderSend(Symbol(),OP_SELL,OrderLots()*3,Bid,slippage,0,0,"sell2",magic,0,Red); } if(profit>rieki) { allClose(Yellow); } } } }

//----

return(0);

}

//+------------------------------------------------------------------+

int MAcross(int fast,int slow)

{

double kakoa,kakob; double gennzaia,gennzaib; kakoa=iMA(NULL,0,fast,0,MODE_SMA,PRICE_CLOSE,1); kakob=iMA(NULL,0,slow,0,MODE_SMA,PRICE_CLOSE,1); gennzaia=iMA(NULL,0,fast,0,MODE_SMA,PRICE_CLOSE,0); gennzaib=iMA(NULL,0,slow,0,MODE_SMA,PRICE_CLOSE,0); if(kakoa<kakob&&gennzaia>=gennzaib) { return(1); } if(kakoa>kakob&&gennzaia<=gennzaib) { return(2); }

return(0);

}

void allClose(color clr)

{

int i; for(i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue; if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,NormalizeDouble(slippage,0),clr); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,NormalizeDouble(slippage,0),clr); }

}

コメントを投稿

0 コメント