//+------------------------------------------------------------------+ //| 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 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Inputs 関数設定 | //+------------------------------------------------------------------+ //Chaikin Oscillator(チャイキンオシレーター) input group "チャイキンオシレーター" input ENUM_TIMEFRAMES CO_period_S = PERIOD_CURRENT; // 対象時間軸_S input int CO_fast_period_S = 3; // 高速期間_S input int CO_slow_period_S = 10; // 低速期間_S input ENUM_MA_METHOD CO_method_S = MODE_EMA; // 平滑化の種類_S input ENUM_APPLIED_VOLUME CO_applied_volume_S = VOLUME_TICK; // ボリュームの種類_S //Chaikin Oscillator(チャイキンオシレーター) input group "チャイキンオシレーター" input ENUM_TIMEFRAMES CO_period_M = PERIOD_CURRENT; // 対象時間軸_M input int CO_fast_period_M = 3; // 高速期間_M input int CO_slow_period_M = 10; // 低速期間_M input ENUM_MA_METHOD CO_method_M = MODE_EMA; // 平滑化の種類_M input ENUM_APPLIED_VOLUME CO_applied_volume_M = VOLUME_TICK; // ボリュームの種類_M //Chaikin Oscillator(チャイキンオシレーター) input group "チャイキンオシレーター" input ENUM_TIMEFRAMES CO_period_L = PERIOD_CURRENT; // 対象時間軸_L input int CO_fast_period_L = 3; // 高速期間_L input int CO_slow_period_L = 10; // 低速期間_L input ENUM_MA_METHOD CO_method_L = MODE_EMA; // 平滑化の種類_L input ENUM_APPLIED_VOLUME CO_applied_volume_L = VOLUME_TICK; // ボリュームの種類_L //+------------------------------------------------------------------+ //| 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; //入力マジックナンバー input bool log_out = 0; //ログを出力するか input bool DamiDami = 0; //ダミー設定 最適化無効用 input group "カスタム結果出力設定" input group "0=無効 1=勝率 2=買勝率 3=売勝率 4=取引数 5=勝率(取引数考慮)" input int Custom_out = 0; //カスタム出力 上記参照 input group "取引数考慮=取引数を最低ロウソク足の数の0.5%以上取引回数した" input double kagen_wariai = 0.5; //取引数考慮 割合% 以下なら結果を無効にする ulong MagicNumber = 123456789; //使用マジックナンバー //分析結果 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); 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 = iChaikin(_Symbol, CO_period_S, CO_fast_period_S, CO_slow_period_S, CO_method_S, CO_applied_volume_S); Signal_Handle_B = iChaikin(_Symbol, CO_period_M, CO_fast_period_M, CO_slow_period_M, CO_method_M, CO_applied_volume_M); Signal_Handle_C = iChaikin(_Symbol, CO_period_L, CO_fast_period_L, CO_slow_period_L, CO_method_L, CO_applied_volume_L); //時間設定 ENUM_TIMEFRAMES MTF_S = CO_period_S; ENUM_TIMEFRAMES MTF_M = CO_period_M; ENUM_TIMEFRAMES MTF_L = CO_period_L; //シングル定義 ここから********************** //シングル定義 ここから********************** //シングル定義 ここから********************** CopyBuffer(Signal_Handle_A, 0, 0, 5, CopyBuf_A); CopyBuffer(Signal_Handle_B, 0, 0, 5, CopyBuf_B); CopyBuffer(Signal_Handle_C, 0, 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]; //シングル定義 ここまで********************** //シングル定義 ここまで********************** //シングル定義 ここまで********************** /* //トリプル定義 ここから********************** //トリプル定義 ここから********************** //トリプル定義 ここから********************** double CopyBuf_D[]; double CopyBuf_E[]; double CopyBuf_F[]; double CopyBuf_G[]; double CopyBuf_H[]; double CopyBuf_I[]; ArraySetAsSeries(CopyBuf_D,true); ArraySetAsSeries(CopyBuf_E,true); ArraySetAsSeries(CopyBuf_F,true); ArraySetAsSeries(CopyBuf_G,true); ArraySetAsSeries(CopyBuf_H,true); ArraySetAsSeries(CopyBuf_I,true); 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); CopyBuffer(Signal_Handle_B, 0, 0, 5, CopyBuf_D); CopyBuffer(Signal_Handle_B, 1, 0, 5, CopyBuf_E); CopyBuffer(Signal_Handle_B, 2, 0, 5, CopyBuf_F); CopyBuffer(Signal_Handle_C, 0, 0, 5, CopyBuf_G); CopyBuffer(Signal_Handle_C, 1, 0, 5, CopyBuf_H); CopyBuffer(Signal_Handle_C, 2, 0, 5, CopyBuf_I); //シグナル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]; //シグナルD kekka[3][0] = CopyBuf_D[0]; kekka[3][1] = CopyBuf_D[1]; kekka[3][2] = CopyBuf_D[2]; kekka[3][3] = CopyBuf_D[3]; //シグナルE kekka[4][0] = CopyBuf_E[0]; kekka[4][1] = CopyBuf_E[1]; kekka[4][2] = CopyBuf_E[2]; kekka[4][3] = CopyBuf_E[3]; //シグナルF kekka[5][0] = CopyBuf_F[0]; kekka[5][1] = CopyBuf_F[1]; kekka[5][2] = CopyBuf_F[2]; kekka[5][3] = CopyBuf_F[3]; //シグナルG kekka[6][0] = CopyBuf_G[0]; kekka[6][1] = CopyBuf_G[1]; kekka[6][2] = CopyBuf_G[2]; kekka[6][3] = CopyBuf_G[3]; //シグナルH kekka[7][0] = CopyBuf_H[0]; kekka[7][1] = CopyBuf_H[1]; kekka[7][2] = CopyBuf_H[2]; kekka[7][3] = CopyBuf_H[3]; //シグナルI kekka[8][0] = CopyBuf_I[0]; kekka[8][1] = CopyBuf_I[1]; kekka[8][2] = CopyBuf_I[2]; kekka[8][3] = CopyBuf_I[3]; //トリプル定義 ここまで********************** //トリプル定義 ここまで********************** //トリプル定義 ここまで********************** */ //価格取得A shift = 1; kekka[10][0] = iOpen(Symbol(),MTF_S,shift); kekka[10][1] = iHigh(Symbol(),MTF_S,shift); kekka[10][2] = iLow(Symbol(),MTF_S,shift); kekka[10][3] = iClose(Symbol(),MTF_S,shift); //価格取得B shift = 1; kekka[11][0] = iOpen(Symbol(),MTF_M,shift); kekka[11][1] = iHigh(Symbol(),MTF_M,shift); kekka[11][2] = iLow(Symbol(),MTF_M,shift); kekka[11][3] = iClose(Symbol(),MTF_M,shift); //価格取得C shift = 1; kekka[12][0] = iOpen(Symbol(),MTF_L,shift); kekka[12][1] = iHigh(Symbol(),MTF_L,shift); kekka[12][2] = iLow(Symbol(),MTF_L,shift); kekka[12][3] = iClose(Symbol(),MTF_L,shift); //チャートにグラフ表示 //ChartIndicatorAdd(ChartID(),0,Signal_Handle_A); //ChartIndicatorAdd(ChartID(),0,Signal_Handle_B); //ChartIndicatorAdd(ChartID(),0,Signal_Handle_C); //買いシグナル //チャイキンオシレーターが中央の0を下抜けする場合 //売りシグナル //チャイキンオシレーターが中央の0を上抜けする場合 //判定 if(Pozi_iti == 0){ if(kekka[0][1] >= 0 && kekka[1][1] >= 0 && kekka[2][1] >= 0){ //上げ hantei = 1; } else if(kekka[0][1] <= 0 && kekka[1][1] <= 0 && kekka[2][1] <= 0){ //下げ hantei = 2; } } else if(Pozi_iti == 1){ //ポジション 買 決済 if(kekka[0][1] <= 0 && kekka[1][1] <= 0 && kekka[2][1] <= 0){ hantei = 10; } } else if(Pozi_iti == 2){ //ポジション 売 決済 if(kekka[0][1] >= 0 && kekka[1][1] >= 0 && kekka[2][1] >= 0){ hantei = 10; } } 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[3][0]," ",kekka[3][1]," ",kekka[3][2]," ",kekka[3][3],"\n", kekka[4][0]," ",kekka[4][1]," ",kekka[4][2]," ",kekka[4][3]); Sleep(50000); */ /* 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; //実際の処理 // ニューバーの発生直後以外は取引しない 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; //ポジションチェック Positions_hantei(0); //インジェクター更新 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]); } }