//+------------------------------------------------------------------+ //| 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 | //+------------------------------------------------------------------+ //Alligator input group "アリゲーター設定" input ENUM_TIMEFRAMES AL_period = PERIOD_CURRENT; // 期間 input int AL_jaw_period = 13; // 顎の計算期間 input int AL_jaw_shift = 8; // 顎の水平シフト input int AL_teeth_period = 8; // 歯の計算期間 input int AL_teeth_shift = 5; // 歯の水平シフト input int AL_lips_period = 5; // 口の計算期間 input int AL_lips_shift = 3; // 口の水平シフト input ENUM_MA_METHOD AL_ma_method = MODE_SMMA; // 平滑化の種類 input ENUM_APPLIED_PRICE AL_applied_price = PRICE_CLOSE; // 価格の種類かハンドル //プロフィット・ストップロス 設定 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 //lotとマジックナンバー input group "ロットとマジックナンバー" input double Fix_Lot = 0.01; //購入ロット input ulong MagicNumberA = 123456789; //入力マジックナンバー input bool log_out = 0; //ログを出力するか input bool DamiDami = 0; //ダミー設定 最適化無効用 ulong MagicNumber = 123456789; //使用マジックナンバー //分析結果 int hantei = 0; //分析結果 double kekka[20][10];//結果メモリ //損益計算の倍率 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; 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 = iAlligator(_Symbol,AL_period,AL_jaw_period,AL_jaw_shift, AL_teeth_period,AL_teeth_shift,AL_lips_period,AL_lips_shift,AL_ma_method,AL_applied_price); //Signal_Handle_B = iMA(_Symbol,T_period_L,MA_period_L,MA_shift_L,MA_method_L,MA_applied_L); //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); //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]; //価格取得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); /* Comment(kekka[0][0]," ",kekka[0][1]," ",kekka[0][2]," ",kekka[0][3]," ",kekka[0][4],"\n", kekka[1][0]," ",kekka[1][1]," ",kekka[1][2]," ",kekka[1][3]," ",kekka[1][4],"\n", kekka[2][0]," ",kekka[2][1]," ",kekka[2][2]," ",kekka[2][3]," ",kekka[2][4],"\n", kekka[10][0]," ",kekka[10][1]," ",kekka[10][2]," ",kekka[10][3]," ",kekka[10][4],"\n", kekka[11][0]," ",kekka[11][1]," ",kekka[11][2]," ",kekka[11][3]," ",kekka[11][4],"\n", kekka[12][0]," ",kekka[12][1]," ",kekka[12][2]," ",kekka[12][3]," ",kekka[12][4]); Sleep(100000); */ //判定 if(kekka[0][1] > kekka[1][1] && kekka[1][1] > kekka[2][1]){ //上げ hantei = 2; } else if(kekka[0][1] < kekka[1][1] && kekka[1][1] < kekka[2][1]){ //下げ hantei = 1; } else{ //保留 hantei = 0; } //チャートにグラフ表示 ChartIndicatorAdd(ChartID(),0,Signal_Handle_A); ChartIndicatorAdd(ChartID(),0,Signal_Handle_B); ChartIndicatorAdd(ChartID(),0,Signal_Handle_C); /* //計算結果表示 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]," ",kekka[3][4]," ",kekka[3][5]," ",kekka[3][6]," ",kekka[3][7],"\n" ); Sleep(50000); */ return( hantei ); } //+------------------------------------------------------------------+ //| "Tick" event handler function | //この関数は、NewTickイベントが発生して新しい相場が処理されるときに、EAで呼び出されます。 //+------------------------------------------------------------------+ void OnTick(){ datetime TimeArray[1]; //ポジションチェック Positions_hantei(0); //インジェクター更新 zyoukyou_bunseki(); //実際の処理 // ニューバーの発生直後以外は取引しない 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; //買い 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("Stay pizi 0 0"); } else if(hantei == 1){ Print("Buy Open 0 1"); Position_Open(1, Fix_Lot, PL_A, TP_A, SL_A, "Buy Open"); } else if(hantei == 2){ Print("Sell Open 0 2"); Position_Open(2, Fix_Lot, PL_B, TP_B, SL_B, "Sell Open"); } else{ Print("ERR1 hantei = ", hantei); } } else if(Pozi_iti == 1){ if(hantei == 0){ Print("Pozi=1 han=0 Stay"); } else if(hantei == 1){ //Print("Pozi=1 han=1 Buy Reset"); //Position_Close(1, Pozi_ban, Pozi_suu, "Buy Close Hanten"); //Position_Open(1, Fix_Lot, PL_B, TP_B, SL_B, "Sell Open"); } else if(hantei == 2){ Print("Pozi Hanten Buy > Sell"); Position_Close(1, Pozi_ban, Pozi_suu, "Buy Close Hanten"); Position_Open(2, Fix_Lot, PL_B, TP_B, SL_B, "Sell Open"); } else{ Print("ERR2 hantei = ", hantei); } } else if(Pozi_iti == 2){ if(hantei == 0){ Print("Pozi=2 han=0 Stay"); } else if(hantei == 1){ Print("Pozi Hanten Sell > Buy"); Position_Close(2, Pozi_ban, Pozi_suu, "Sell Close Hanten"); Position_Open(1, Fix_Lot, PL_A, TP_A, SL_A, "Sell Open"); } else if(hantei == 2){ //Print("Pozi=2 han=2 Sell Reset"); //Position_Close(2, Pozi_ban, Pozi_suu, "Sell Close Hanten"); //Position_Open(2, Fix_Lot, PL_B, TP_B, SL_B, "Sell 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); } else if(Syori_Naiyou == 2){ //成り行き 売り req.type = ORDER_TYPE_SELL; req.price = SymbolInfoDouble(Symbol(),SYMBOL_BID); } else{ 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; } //実際の注文 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; } 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); } else if(Syori_Naiyou == 2){ req.type = ORDER_TYPE_BUY; req.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK); } 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; } 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; } return( Pozi_Kekka ); }