//+------------------------------------------------------------------+
//| 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型の変数を使うのはダメです
結構やりがちなミスかなと思います。
しかもエラーが出ないので原因もわかりづらい
参考になれば幸いです
※使用する際は注意事項をよく読んで、自分の環境で使えるかどうか
判断し、自己責任で使用してください。
ではでは