//+------------------------------------------------------------------+
//|                                                     toraripi.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict





double price_down = 0.0;
double lot = 0.0;
int dd;

double dig;  //←暴走の原因



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 
   price_down = 0.0;
   
   int fileno = FileOpen("lot.csv", FILE_READ | FILE_WRITE | FILE_CSV,",");
   
      
      
      string aaa = FileReadString(fileno);
      FileClose(fileno);  
      
      lot = StrToDouble(aaa);
           
   if ( lot == 0.0){        

      lot = (int)(AccountFreeMargin()*(80-((AccountFreeMargin()-2500)/10000))/20/100/1000*100);
      
      lot = lot / 100;
      
      if(lot < 0.1)lot = 0.1;
      
      
      fileno = FileOpen("lot.csv", FILE_READ | FILE_WRITE | FILE_CSV,",");
      FileWrite(fileno,lot);
      FileClose(fileno);
      
      Print("aaa");   
   
   }
   
dd = Day();

Print(lot);

if(Digits() == 5)dig=10000.0;
else if(Digits() == 3)dig=100.0;

Print(dig);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

if (dd != Day()){

      lot = (int)(AccountFreeMargin()*(80-((AccountFreeMargin()-2500)/10000))/20/100/1000*100);
      
      lot = lot / 100;
      
      if(lot < 0.1)lot = 0.1;
      
      int fileno = FileOpen("lot.csv",  FILE_WRITE | FILE_CSV,",");
      
      FileWrite(fileno,lot);
      
      FileClose(fileno);    
      
      dd = Day();
      
}



int open;

if( Hour() == 0 ){open=0;}
else if( Hour() == 23 &&  Minute() >= 50){open=0;}
else {open=1;}
   

if (open == 1){

   check();
   
   down();
   
   close();  

}


 
Comment("基準価格 = ",price_down);


  }
//+------------------------------------------------------------------+


//------------------------------
void down(){

   if (price_down > 0.0){
    
      if (MarketInfo(Symbol(),MODE_BID) > price_down + (5/dig) ){  //←暴走の原因
      
         
            if (OrderSend(Symbol(),OP_SELL,lot,Bid,30,0,0,"SELL",0,0,Red) == TRUE){
            
               
               return;
              
            
            }
            
      }
    }
   if (price_down == 0.0  ){

      
         if (OrderSend(Symbol(),OP_SELL,lot,Bid,30,0,0,"SELL",0,0,Red) == TRUE){
         
              
              return;
             
         }
         
      
      }
   }

//--------------------------------------------------------------------------

void close(){

    for(int i = OrdersTotal()-1 ; i >= 0; i--){
    
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
         
            if(OrderSymbol() == Symbol()){
            
               if(OrderType() == OP_SELL){
               
                  if (MarketInfo(Symbol(),MODE_ASK) < OrderOpenPrice()+(OrderSwap()/dig/(lot*10)) - (5/dig)){
                             
                     if (OrderClose(OrderTicket(),OrderLots(),Ask,30,Orange) == TRUE)price_down = 0.0;
                     
                     
                     
                  }  
               }
               
            }
    
    }
}
//----------------------------------------------------------
void check(){



if ( OrdersTotal()> 0){
    
       for(int i = OrdersTotal() -1 ; i >= 0; i--){
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE){
            
               if(OrderSymbol() == Symbol()){
               
                 if(OrderType() == OP_SELL){
                  
                        
                     
                        price_down = OrderOpenPrice();
                              
                        break;
                    
                  
                  
                  }
               
                     
               }
            }
       
       }
     
    }

}

 

//--------------ここまで------------------//

 

暴走の原因は

 

変数 dig を 最初はint型で宣言してたことですね

 

MQL4の場合

 

小数点以下になる計算でint型の変数を使うのはダメです

 

結構やりがちなミスかなと思います。

 

しかもエラーが出ないので原因もわかりづらい

 

 

参考になれば幸いです

 

※使用する際は注意事項をよく読んで、自分の環境で使えるかどうか

判断し、自己責任で使用してください。

 

ではでは

 

 

にほんブログ村 為替ブログ システムトレード 自作EA派へ
にほんブログ村