//+------------------------------------------------------------------+ //| 20210811.mq5 | //| Copyright 2021, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ //#property copyright "Copyright 2021, MetaQuotes Software Corp." //#property link "https://www.mql5.com" //#property version "1.00" //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ //#include //+------------------------------------------------------------------+ //| Inputs 関数設定 | //+------------------------------------------------------------------+ //On Balance Volume input group "オンバランスボリューム" input ENUM_TIMEFRAMES OB_period = PERIOD_CURRENT; // 対象時間軸 input ENUM_APPLIED_VOLUME OB_applied_volume = VOLUME_TICK; // 計算に使用するボリュームの種類 //+------------------------------------------------------------------+ //| Inputs 共通設定 | //+------------------------------------------------------------------+ //プロフィット・ストップロス 設定 input group "プロフィット ストップロス 設定" //注文時 input double TP_Bairitu = 0; //注文時プロフィット 0=設定しない 以外=現在価格からの、率 例: 0.005 input double SL_Bairitu = 0; //注文時ストップロス 0=設定しない 以外=現在価格からの、率 例: 0.005 //ティック時 input int TP_kin = 0; //ティック時判定 プロフィット 0=設定しない 以外=固定値判定 例: 100 input int SL_kin = 0; //ティック時判定 ストップロス 0=設定しない 以外=固定値判定 例: -100 //反転売買 input bool Hanten_Baibai = 0; //判定決済時、反転売買をする プロフィット、ストップは、しない //lotとマジックナンバー input group "ロットとマジックナンバー" input double Fix_Lot = 0.01; //購入ロット input ulong MagicNumberA = 123456789; //入力マジックナンバー ulong MagicNumber = 123456789; //使用マジックナンバー //情報出力設定 input group "情報出力設定" input bool log_out = 0; //ログを出力するか input bool log_file_out = 0; //ログをファイルに出力するか string logdata_path = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\EA_Log\\"; //出力パス string logdata_name = ".csv"; //出力形式 input group "テスターカスタム結果出力" input int Custom_out = 0; //カスタム出力 0=無効 1=勝率 2=買勝率 3=売勝率 4=取引数 5=勝率(取引数考慮) input double kagen_wariai = 0.5; //取引数考慮 最低ロウソク足の割合% 以下なら結果を無効にする input int  DamiDami = 0; //ダミー設定 最適化無効用 //分析結果 int hantei = 0; //分析結果 double kekka[20][5]; //結果メモリ double syouritu[6][5]; //勝率メモリ //損益計算の倍率 USDならば100倍 JPNならば1倍 int Kouza_Tuuka_Bairitu = 1; //ポジション情報 int x_total = 0; //ポジション数 int Pozi_iti = 0; //ポジション種類 ulong Pozi_ban = 0; //ポジション番号 double Pozi_prof = 0; //ポジション損益 double Pozi_suu = 0; //Lot数 ulong Pozi_magic = 0; //マジックナンバー ulong symbol_keta_A = 0; //シンボルごとの桁数 シンボルからの入力用 double symbol_keta = 0; //シンボルごとの桁数 損益判定結果 //注文設定 int Surippe = 10; //スリッページ //現在時間 datetime Time_now; datetime Time_old; //+------------------------------------------------------------------+ //| Global expert object | //+------------------------------------------------------------------+ //CExpert ExtExpert; //+------------------------------------------------------------------+ //| Initialization function of the expert | //この関数は、Initイベントが発生するときに指標やEAで呼び出され、実行中のMQL5プログラムを初期化するのに使用されます。 //+------------------------------------------------------------------+ int OnInit(){ //マジックナンバーを定義 if(MagicNumber == MagicNumberA){ MathSrand(GetTickCount()); MagicNumber = MathRand(); MathSrand(GetTickCount()); MagicNumber = MagicNumber * MathRand(); } else{ MagicNumber = MagicNumberA; } //桁数定義 symbol_keta_settei(); //口座通貨設定 if(AccountInfoString(ACCOUNT_CURRENCY) == "JPY"){ Kouza_Tuuka_Bairitu = 1; } else{ Kouza_Tuuka_Bairitu = 100; } //現在のポジションを取得 Positions_hantei(1); //ポジションがあればマジックナンバーを置き換える if(Pozi_iti != 0){ MagicNumber = Pozi_magic; } //Comment("MagicNumber = ", MagicNumber); //Sleep(50000); //現在の状況を分析 zyoukyou_bunseki(); //時間軸を初期化 datetime TimeArray[1]; CopyTime(_Symbol, _Period, 0, 1, TimeArray); Time_now = TimeArray[0]; Time_old = Time_now; //勝率メモリ初期化 ArrayInitialize(syouritu,0); //ログファイルを出力するか?するならば現状ファイル削除。 if(log_file_out == true){ //logdata_name = logdata_path + Genzyou_Hozon_syokika() + ".csv"; if(FileIsExist(logdata_path, 1) != 1){ //Pozi_iti = FolderCreate(logdata_path, 1); //Comment(Pozi_iti);Sleep(50000); } if(FileIsExist(logdata_name, 1) != 1){ //Comment(logdata_name);Sleep(50000); } //Comment(logdata_name); //Sleep(50000); } return(INIT_SUCCEEDED); } //データ分析 int zyoukyou_bunseki(){ //ハンドル初期化 int Signal_Handle_A = 0; int Signal_Handle_B = 0; int Signal_Handle_C = 0; //結果メモリ double CopyBuf_A[]; double CopyBuf_B[]; double CopyBuf_C[]; ArraySetAsSeries(CopyBuf_A,true); ArraySetAsSeries(CopyBuf_B,true); ArraySetAsSeries(CopyBuf_C,true); //判定結果初期化 hantei = 0; ArrayInitialize(kekka,0); int shift = 0; Signal_Handle_A = iOBV(_Symbol, OB_period, OB_applied_volume); //Signal_Handle_B = iBands(_Symbol,Bo_period,Bo_bands_period,Bo_bands_shift,Bo_deviation,Bo_applied_price); //Signal_Handle_C = iMA(_Symbol,T_period_L,MA_period_L,MA_shift_L,MA_method_L,MA_applied_L); CopyBuffer(Signal_Handle_A, 0, 0, 5, CopyBuf_A); CopyBuffer(Signal_Handle_A, 1, 0, 5, CopyBuf_B); CopyBuffer(Signal_Handle_A, 2, 0, 5, CopyBuf_C); //シグナルA kekka[0][0] = CopyBuf_A[0]; kekka[0][1] = CopyBuf_A[1]; kekka[0][2] = CopyBuf_A[2]; kekka[0][3] = CopyBuf_A[3]; //シグナルB kekka[1][0] = CopyBuf_B[0]; kekka[1][1] = CopyBuf_B[1]; kekka[1][2] = CopyBuf_B[2]; kekka[1][3] = CopyBuf_B[3]; //シグナルC kekka[2][0] = CopyBuf_C[0]; kekka[2][1] = CopyBuf_C[1]; kekka[2][2] = CopyBuf_C[2]; kekka[2][3] = CopyBuf_C[3]; //価格取得A shift = 0; kekka[10][0] = iOpen(Symbol(),Period(),shift); kekka[10][1] = iHigh(Symbol(),Period(),shift); kekka[10][2] = iLow(Symbol(),Period(),shift); kekka[10][3] = iClose(Symbol(),Period(),shift); //価格取得B shift = 1; kekka[11][0] = iOpen(Symbol(),Period(),shift); kekka[11][1] = iHigh(Symbol(),Period(),shift); kekka[11][2] = iLow(Symbol(),Period(),shift); kekka[11][3] = iClose(Symbol(),Period(),shift); //価格取得C shift = 2; kekka[12][0] = iOpen(Symbol(),Period(),shift); kekka[12][1] = iHigh(Symbol(),Period(),shift); kekka[12][2] = iLow(Symbol(),Period(),shift); kekka[12][3] = iClose(Symbol(),Period(),shift); //チャートにグラフ表示 ChartIndicatorAdd(ChartID(),0,Signal_Handle_A); //ChartIndicatorAdd(ChartID(),0,Signal_Handle_B); //ChartIndicatorAdd(ChartID(),0,Signal_Handle_C); if(Pozi_iti == 0){ //ポジションなし 一目判定 バンド判定 if(kekka[0][1] >= kekka[0][2]){ //上げ hantei = 1; } else if(kekka[0][1] <= kekka[0][2]){ //下げ hantei = 2; } else{ //保留 hantei = 0; } } else if(Pozi_iti == 1){ //ポジション 買 決済 if(kekka[0][1] <= kekka[0][2]){ //決済 hantei = 10; } else{ //保留 hantei = 0; } } else if(Pozi_iti == 2){ //ポジション 売 決済 if(kekka[0][1] >= kekka[0][2]){ //決済 hantei = 10; } else{ //保留 hantei = 0; } } else{ hantei = 0; } //計算結果表示 /* Comment(hantei,"\n", kekka[0][0]," ",kekka[0][1]," ",kekka[0][2]," ",kekka[0][3],"\n", kekka[1][0]," ",kekka[1][1]," ",kekka[1][2]," ",kekka[1][3],"\n", kekka[2][0]," ",kekka[2][1]," ",kekka[2][2]," ",kekka[2][3],"\n", kekka[10][0]," ",kekka[10][1]," ",kekka[10][2]," ",kekka[10][3],"\n", kekka[11][0]," ",kekka[11][1]," ",kekka[11][2]," ",kekka[11][3],"\n", kekka[12][0]," ",kekka[12][1]," ",kekka[12][2]," ",kekka[12][3] */ return( hantei ); } //+------------------------------------------------------------------+ //| "Tick" event handler function | //この関数は、NewTickイベントが発生して新しい相場が処理されるときに、EAで呼び出されます。 //+------------------------------------------------------------------+ void OnTick(){ datetime TimeArray[1]; syouritu[5][0] = syouritu[5][0] + 1; //ポジションチェック Positions_hantei(0); //ログを残すか? if(log_file_out == true){ Genzyou_Hozon(logdata_name, Pozi_iti, Pozi_suu, Pozi_prof); } //実際の処理 // ニューバーの発生直後以外は取引しない CopyTime(_Symbol, _Period, 0, 1, TimeArray); Time_now = TimeArray[0]; if(Time_now == Time_old){ if(Pozi_iti == 0){ //ポジションなし なにもしない hantei = 0; } else if(Pozi_iti == 1){ if(TP_kin != 0 && Pozi_prof >= TP_kin){ Print("Buy Rikaku ",Pozi_prof," > ", TP_kin); Position_Close(1, Pozi_ban, Pozi_suu, "Buy Rikaku 2"); } else if(SL_kin != 0 && Pozi_prof <= SL_kin){ Print("Buy Songiri ",Pozi_prof," < ",SL_kin); Position_Close(1, Pozi_ban, Pozi_suu, "Sell Songiri 1"); } else{ hantei = 0; } } else if(Pozi_iti == 2){ if(TP_kin != 0 && Pozi_prof >= TP_kin){ Print("Sell Rikaku ",Pozi_prof," > ", TP_kin); Position_Close(2, Pozi_ban, Pozi_suu, "Sell Rikaku 2"); } else if(SL_kin != 0 && Pozi_prof <= SL_kin){ Print("Sell Songiri ",Pozi_prof," < ",SL_kin); Position_Close(2, Pozi_ban, Pozi_suu, "Sell Songiri 1"); } else{ hantei = 0; } } else{ //何もしない Print("ERR Pozi_iti = ",Pozi_iti); } } else{ //時間軸更新 Time_old = Time_now; syouritu[5][1] = syouritu[5][1] + 1; //インジェクター更新 zyoukyou_bunseki(); //買い PL TP SL 作成 double PL_A = 0; double TP_A = 0; double SL_A = 0; if(TP_Bairitu == 0 && SL_Bairitu == 0){ PL_A = 0; TP_A = 0; SL_A = 0; } else if(TP_Bairitu == 0 && SL_Bairitu != 0){ PL_A = SymbolInfoDouble(Symbol(),SYMBOL_ASK); TP_A = 0; SL_A = PL_A - (PL_A * SL_Bairitu); } else if(TP_Bairitu != 0 && SL_Bairitu == 0){ PL_A = SymbolInfoDouble(Symbol(),SYMBOL_ASK); TP_A = PL_A + (PL_A * TP_Bairitu); SL_A = 0; } else{ PL_A = SymbolInfoDouble(Symbol(),SYMBOL_ASK); TP_A = PL_A + (PL_A * TP_Bairitu); SL_A = PL_A - (PL_A * SL_Bairitu); } //売り PL TP SL 作成 double PL_B = 0; double TP_B = 0; double SL_B = 0; if(TP_Bairitu == 0 && SL_Bairitu == 0){ PL_B = 0; TP_B = 0; SL_B = 0; } else if(TP_Bairitu == 0 && SL_Bairitu != 0){ PL_B = SymbolInfoDouble(Symbol(),SYMBOL_BID); TP_B = 0; SL_B = PL_B + (PL_B * SL_Bairitu); } else if(TP_Bairitu != 0 && SL_Bairitu == 0){ PL_B = SymbolInfoDouble(Symbol(),SYMBOL_BID); TP_B = PL_B - (PL_B * TP_Bairitu); SL_B = 0; } else{ PL_B = SymbolInfoDouble(Symbol(),SYMBOL_BID); TP_B = PL_B - (PL_B * TP_Bairitu); SL_B = PL_B + (PL_B * SL_Bairitu); } if(Pozi_iti == 0){ //新規ポジション if(hantei == 0){ Print("No pizi"); } else if(hantei == 1){ Print("Buy Open"); Position_Open(1, Fix_Lot, PL_A, TP_A, SL_A, "Buy Open"); } else if(hantei == 2){ Print("Sell Open"); Position_Open(2, Fix_Lot, PL_B, TP_B, SL_B, "Sell Open"); } else{ Print("ERR1 hantei = ", hantei); } hantei = 0; } else if(Pozi_iti == 1){ if(hantei == 0){ Print("Pozi=1 han=0 Stay"); } else if(hantei == 10){ Print("Buy Close"); Position_Close(1, Pozi_ban, Pozi_suu, "Buy Close"); if(Hanten_Baibai == 1){ Print("Sell Open Hanten"); Position_Open(2, Fix_Lot, PL_B, TP_B, SL_B, "Sell Open"); } } else{ Print("ERR2 hantei = ", hantei); } hantei = 0; } else if(Pozi_iti == 2){ if(hantei == 0){ Print("Pozi=2 han=0 Stay"); } else if(hantei == 10){ Print("Sell Close"); Position_Close(2, Pozi_ban, Pozi_suu, "Sell Close"); if(Hanten_Baibai == 1){ Print("Buy Open Hanten"); Position_Open(1, Fix_Lot, PL_A, TP_A, SL_A, "Buy Open"); } } else{ Print("ERR2 hantei = ", hantei); } } } //コメント出力 if(log_out == true){ Comment("ServerTime = ",TimeTradeServer()," now = ",Time_now," old = ",Time_old, "MagicNumber = ", MagicNumber, "\n", "Pozi_iti = ",Pozi_iti," Pozi_ban = ",Pozi_ban," Pozi_prof = ",Pozi_prof, "\n", "STO K", kekka[0][0]," ",kekka[0][1]," ",kekka[0][2], kekka[0][3]," ",kekka[0][4], "\n", "STO D=", kekka[1][0]," ",kekka[1][1]," ",kekka[1][2]," ",kekka[1][3]," ",kekka[1][4], "\n", "Genzai=", kekka[3][0]," ",kekka[3][1]," ",kekka[3][2]," ",kekka[3][3]," ",kekka[3][4], "\n", "TP_kin = ",TP_kin,"SL_kin = ", SL_kin); //Sleep(5000); } } void Positions_hantei(int settei){ ulong position_ticket = 0; PositionSelectByTicket(12345678987654321); x_total = 0; Pozi_iti = 0; Pozi_ban = 0; Pozi_prof = 0; Pozi_suu = 0; x_total = PositionsTotal(); if(x_total == 0){ //何もしない } else{ for(int i = x_total - 1 ; i >= 0 ; i--){ //ポジションを一つ選択する position_ticket = PositionGetTicket(i); PositionSelectByTicket(position_ticket); if(PositionSelectByTicket(position_ticket) == 1){ if(settei == 0){ //マジックナンバーで検索 ポジが存在するか if(MagicNumber == PositionGetInteger(POSITION_MAGIC)){ if(PositionGetInteger(POSITION_TYPE) == 0){ Pozi_iti = 1; Pozi_ban = position_ticket; Pozi_prof = PositionGetDouble(POSITION_PROFIT) * Kouza_Tuuka_Bairitu; Pozi_suu = PositionGetDouble(POSITION_VOLUME); Pozi_magic = PositionGetInteger(POSITION_MAGIC); } else if(PositionGetInteger(POSITION_TYPE) == 1){ Pozi_iti = 2; Pozi_ban = position_ticket; Pozi_prof = PositionGetDouble(POSITION_PROFIT)* Kouza_Tuuka_Bairitu; Pozi_suu = PositionGetDouble(POSITION_VOLUME); Pozi_magic = PositionGetInteger(POSITION_MAGIC); } else{ //何もしない } } } else if(settei == 1){ //シンボルで検索 ポジが存在するか if(_Symbol == PositionGetString(POSITION_SYMBOL)){ if(PositionGetInteger(POSITION_TYPE) == 0){ Pozi_iti = 1; Pozi_ban = position_ticket; Pozi_prof = PositionGetDouble(POSITION_PROFIT) * Kouza_Tuuka_Bairitu; Pozi_suu = PositionGetDouble(POSITION_VOLUME); Pozi_magic = PositionGetInteger(POSITION_MAGIC); } else if(PositionGetInteger(POSITION_TYPE) == 1){ Pozi_iti = 2; Pozi_ban = position_ticket; Pozi_prof = PositionGetDouble(POSITION_PROFIT)* Kouza_Tuuka_Bairitu; Pozi_suu = PositionGetDouble(POSITION_VOLUME); Pozi_magic = PositionGetInteger(POSITION_MAGIC); } else{ //何もしない } } } else{ Print("ERR Positions_hantei settei = ", settei); } } } } //コメント出力 //if(log_out == 1){Comment("total = ",x_total,"\n",PositionGetDouble(POSITION_PROFIT),"\nPozi_iti = ",Pozi_iti," Pozi_ban = ",Pozi_ban," Pozi_prof = ",Pozi_prof);Sleep(10000);} } void symbol_keta_settei(){ symbol_keta_A = SymbolInfoInteger(Symbol(),SYMBOL_DIGITS); if(symbol_keta_A == 0){ symbol_keta = 0.001; } else if(symbol_keta_A == 1){ symbol_keta = 0.01; } else if(symbol_keta_A == 2){ symbol_keta = 0.1; } else if(symbol_keta_A == 3){ symbol_keta = 1; } else if(symbol_keta_A == 4){ symbol_keta = 10; } else if(symbol_keta_A == 5){ symbol_keta = 100; } else{ symbol_keta = 1; } symbol_keta = symbol_keta * 100; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Deinitialization function of the expert | //この関数はDeinitイベントが発生するときに指標やEAで呼び出され、実行中のMQL5プログラムの初期化を解除するのに使用されます。 //+------------------------------------------------------------------+ void OnDeinit(const int reason){ //ExtExpert.Deinit(); } bool Position_Open(int Syori_Naiyou, double Kounyu_Lot, double PL, double TP, double SL, string Riq_Come){ bool Pozi_Kekka = 0; MqlTradeRequest req={}; req.action = TRADE_ACTION_DEAL; req.symbol = Symbol(); req.magic = MagicNumber; req.volume = Kounyu_Lot; req.deviation = Surippe; req.type_time = ORDER_TIME_GTC; req.comment = Riq_Come; //売買方向 if(Syori_Naiyou == 1){ //成り行き 買い req.type = ORDER_TYPE_BUY; req.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK); Pozi_Kekka = 1; } else if(Syori_Naiyou == 2){ //成り行き 売り req.type = ORDER_TYPE_SELL; req.price = SymbolInfoDouble(Symbol(),SYMBOL_BID); Pozi_Kekka = 1; } else{ Pozi_Kekka = 0; //return( Pozi_Kekka ); } //指値があるか? if(PL == 0){ req.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK); } else{ req.price = PL; } //プロフィット値があるか? if(TP == 0){ req.tp = 0; } else{ req.tp = TP; } //ストップ値があるか? if(SL == 0){ req.sl = 0; } else{ req.sl = SL; } //充填タイプ if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE) == 1){ req.type_filling = ORDER_FILLING_FOK; } else{ req.type_filling = ORDER_FILLING_IOC; } //実際の注文 if(Pozi_Kekka == 1){ MqlTradeResult res={0}; if(!OrderSend(req,res)){ if(log_out == 1){ Comment("Open",__FUNCTION__,": error ",GetLastError()," ",res.comment,", retcode = ",res.retcode); //Sleep(3000); } Pozi_Kekka = 0; } else{ Pozi_Kekka = 1; } } else{ Pozi_Kekka = 0; } //カスタム出力処理 if(Custom_out != 0){ //記録作成 if(Pozi_Kekka == 0){ Syori_Naiyou = 91; } Syouritu_kiroku(Syori_Naiyou); } return( Pozi_Kekka ); } bool Position_Close(int Syori_Naiyou, ulong position_ticket, double Kounyu_Lot, string Riq_Come){ bool Pozi_Kekka = 0; MqlTradeRequest req={}; req.action = TRADE_ACTION_DEAL; req.position = position_ticket; req.symbol = Symbol(); req.volume = Kounyu_Lot; req.deviation = Surippe; req.magic = MagicNumber; req.comment = Riq_Come; req.type_time = ORDER_TIME_GTC; //決済方向 if(Syori_Naiyou == 1){ req.type = ORDER_TYPE_SELL; req.price = SymbolInfoDouble(Symbol(),SYMBOL_BID); Pozi_Kekka = 1; } else if(Syori_Naiyou == 2){ req.type = ORDER_TYPE_BUY; req.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK); Pozi_Kekka = 1; } else{ Pozi_Kekka = 0; //return( Pozi_Kekka ); } //充填タイプ if(SymbolInfoInteger(Symbol(),SYMBOL_FILLING_MODE) == 1){ req.type_filling= ORDER_FILLING_FOK; } else{ req.type_filling= ORDER_FILLING_IOC; } //実際の注文 if(Pozi_Kekka == 1){ MqlTradeResult res={0}; if(!OrderSend(req,res)){ if(log_out == 1){ Comment("Close", __FUNCTION__,": error ",GetLastError()," ",res.comment,", retcode = ",res.retcode); //Sleep(3000); } Pozi_Kekka = 0; } else{ Pozi_Kekka = 1; } } else{ Pozi_Kekka = 0; } //カスタム出力処理 if(Custom_out != 0){ //記録作成 if(Pozi_Kekka == 0){ Syori_Naiyou = 92; } else{ if(Syori_Naiyou == 1){ Syori_Naiyou = 11; } else if(Syori_Naiyou == 2){ Syori_Naiyou = 12; } else{ Syori_Naiyou = 92; } } Syouritu_kiroku(Syori_Naiyou); } return( Pozi_Kekka ); } void Syouritu_kiroku(int Syori_Naiyou){ //Syori_Naiyou = 0  > 全体カウントのみ //Syori_Naiyou = 1 > 新規 買い //Syori_Naiyou = 2 > 新規 売り //Syori_Naiyou = 11 > 決済 買い //Syori_Naiyou = 12 > 決済 売り //Syori_Naiyou = 91 > 新規 注文エラー //Syori_Naiyou = 92 > 決済 注文エラー //0 > 全体数,新規注文エラー数,決済注文エラー数,処理分岐エラー数,勝率 //1 > 新買数,決買数,買益率,買損率,買イーブン数 //2 > 買益数,買損数,買益額,買損額,買損益額 //3 > 新売数,決売数,売益率,売損率,売イーブン数 //4 > 売益数,売損数,売益額,売損額,売損益額 //5 > ティック数,ロウソク数,,, //最終約定取引のProfitを取得 double profit = 0; //--- 取引履歴をリクエストする * 直近30秒 以内の履歴を取得 HistorySelect(TimeCurrent()-30,TimeCurrent()); uint total = HistoryDealsTotal(); ulong ticket=0; for(uint i=0; i < total; i++){ ticket = HistoryDealGetTicket(i); if (HistoryDealGetInteger(ticket, DEAL_MAGIC) == MagicNumber){ profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); } } //Comment("total = ", total, "\n", "profit = ", profit); //全体カウント syouritu[0][0] = syouritu[0][0] + 1; //新規 買い 処理 if(Syori_Naiyou == 1){ //カウント syouritu[1][0] = syouritu[1][0] + 1; } //新規 売り 処理 else if(Syori_Naiyou == 2){ //カウント syouritu[3][0] = syouritu[3][0] + 1; } //決済 買い 処理 else if(Syori_Naiyou == 11){ //カウント syouritu[1][1] = syouritu[1][1] + 1; //結果記録 if(profit > 0){ //買益数 syouritu[2][0] = syouritu[2][0] + 1; } else if(profit < 0){ //買損数 syouritu[2][1] = syouritu[2][1] + 1; } else{ //買イーブン数 syouritu[1][4] = syouritu[1][4] + 1; } //買益率 syouritu[1][2] = syouritu[2][0] / syouritu[1][1]; //買損率 syouritu[1][3] = syouritu[2][1] / syouritu[1][1]; //買益額,買損額 if(profit > 0){ syouritu[2][2] = syouritu[2][2] + profit; } else if(profit < 0){ syouritu[2][3] = syouritu[2][3] + profit; } else{ // syouritu[1][4] = syouritu[1][4] + 1; } //買損益額 syouritu[2][4] = syouritu[2][2] + syouritu[2][3]; //勝率 syouritu[0][4] = (syouritu[2][0] + syouritu[4][0]) / (syouritu[1][1] + syouritu[3][1]); } //決済 売り 処理 else if(Syori_Naiyou == 12){ //カウント syouritu[3][1] = syouritu[3][1] + 1; //結果記録 if(profit > 0){ //売益数 syouritu[4][0] = syouritu[4][0] + 1; } else if(profit < 0){ //売損数 syouritu[4][1] = syouritu[4][1] + 1; } else{ //買イーブン数 syouritu[3][4] = syouritu[3][4] + 1; } //売益率 syouritu[3][2] = syouritu[4][0] / syouritu[3][1]; //売損率 syouritu[3][3] = syouritu[4][1] / syouritu[3][1]; //売益額,売損額 if(profit > 0){ syouritu[4][2] = syouritu[4][2] + profit; } else if(profit < 0){ syouritu[4][3] = syouritu[4][3] + profit; } else{ // syouritu[1][4] = syouritu[1][4] + 1; } //売損益額 syouritu[4][4] = syouritu[4][2] + syouritu[4][3]; //勝率 syouritu[0][4] = (syouritu[2][0] + syouritu[4][0]) / (syouritu[1][1] + syouritu[3][1]); } //エラーカウント else if(Syori_Naiyou == 91){ //新規エラー カウント syouritu[0][1] = syouritu[0][1] + 1; } //エラーカウント else if(Syori_Naiyou == 92){ //決済エラー カウント syouritu[0][2] = syouritu[0][2] + 1; } //処理分岐エラーカウント else{ syouritu[0][3] = syouritu[0][3] + 1; } } double OnTester(){ /* //計算結果表示 Comment(syouritu[0][0]," ",syouritu[0][1]," ",syouritu[0][2]," ",syouritu[0][3]," ",syouritu[0][4],"\n", syouritu[1][0]," ",syouritu[1][1]," ",syouritu[1][2]," ",syouritu[1][3]," ",syouritu[1][4],"\n", syouritu[2][0]," ",syouritu[2][1]," ",syouritu[2][2]," ",syouritu[2][3]," ",syouritu[2][4],"\n", syouritu[3][0]," ",syouritu[3][1]," ",syouritu[3][2]," ",syouritu[3][3]," ",syouritu[3][4],"\n", syouritu[4][0]," ",syouritu[4][1]," ",syouritu[4][2]," ",syouritu[4][3]," ",syouritu[4][4],"\n", syouritu[5][0]," ",syouritu[5][1]," ",syouritu[5][2]," ",syouritu[5][3]," ",syouritu[5][4]); */ //"0=無効 1=勝率 2=買勝率 3=売勝率 4=取引数 5=勝率(取引数考慮)" if(Custom_out == 0){ return(0); } else if(Custom_out == 1){ return(syouritu[0][4]); } else if(Custom_out == 2){ return(syouritu[1][2]); } else if(Custom_out == 3){ return(syouritu[3][2]); } else if(Custom_out == 4){ return((syouritu[1][1] + syouritu[3][1])); } else if(Custom_out == 5){ if(syouritu[5][1] * (kagen_wariai / 100) > (syouritu[1][1] + syouritu[3][1])){ return(0); } else{ return(syouritu[0][4]); } } else{ return(syouritu[0][4]); } } string Genzyou_Hozon_syokika(){ //ファイル出力用パス ファイル名設定 //string logdata_path = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Logs\\EA_Log\\"; //string logdata_name = ".csv"; string filename = _Symbol + "_"; string value = ""; datetime value_i = 0; string value_a[]; switch(_Period){ case PERIOD_M1: value = "M1"; break; case PERIOD_M2: value = "M2"; break; case PERIOD_M3: value = "M3"; break; case PERIOD_M4: value = "M4"; break; case PERIOD_M5: value = "M5"; break; case PERIOD_M6: value = "M6"; break; case PERIOD_M10: value = "M10"; break; case PERIOD_M12: value = "M12"; break; case PERIOD_M15: value = "M15"; break; case PERIOD_M20: value = "M20"; break; case PERIOD_M30: value = "M30"; break; case PERIOD_H1: value = "H1"; break; case PERIOD_H2: value = "H2"; break; case PERIOD_H3: value = "H3"; break; case PERIOD_H4: value = "H4"; break; case PERIOD_H6: value = "H6"; break; case PERIOD_H8: value = "H8"; break; case PERIOD_H12: value = "H12"; break; case PERIOD_D1: value = "D1"; break; case PERIOD_W1: value = "W1"; break; case PERIOD_MN1: value = "MN1"; break; default: value = "None"; break; } filename = filename + value + "_"; value = TimeToString(TimeLocal()); value = StringFormat(value, ""); StringReplace(value, ".", ""); StringSplit(value, StringGetCharacter(" ", 0), value_a); value = value_a[0]; filename = filename + value; //Comment(filename);Sleep(50000); return(filename); } void Genzyou_Hozon(string filename, int iti, double suu, double prof){ //--- 指標値を書き込むためにファイルを開く(ファイルが存在しない場合は自動的に作成される) int file_handle=FileOpen(filename, FILE_SHARE_WRITE); if(file_handle != INVALID_HANDLE){ FileWrite(file_handle, iti, suu, prof); } else{ //Comment(filename, " ", file_handle);Sleep(50000); } }