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); } }