//+------------------------------------------------------------------+ //| Exporter_SN.mq5 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property copyright " * * * Lucifer * * * " // * * * Источник сигналов VER 3.11 SN * * * #property link "https://youtu.be/A9p9RxFYHOQ" // MASTER //------------------------------------------------------------------------------------------ input string mp="спред: 1-Фиксированный / 0-авто-определение"; input int SPREAD_CONST=0; //------------------------------------------------------------------------------------------ input string m9="режим: 0=запись, 1=торговля, 2=торговля+запись"; input int MWORK=2; //------------------------------------------------------------------------------------------ input string tl="время: 1- локальное / 0- с сервера"; input int USE_LOCAL_TIME=0; //------------------------------------------------------------------------------------------ input string ma="использовать MAGIC NUMBER: >0-ДА / 0-НЕТ"; input int MAGIC_NUMBER=0; //------------------------------------------------------------------------------------------ static bool no_worked, Agree, MATCH_LIMIT_ORDERS, FREE[3000], WAIT[3000], ORIGIN; static string s2, s3, VAR_NAME[], s5, DATA_PATH; static int Direction[500], PIP[], PIP2[], TRADE_SHIFT_LIM, RISE_VECTOR, Digits_now, MG_ZOOM, MMM0[500]; static int PERCENT_OF_CUT, TICKS_ALL, ORDERLIFE_LIM, ORDERLIFE, MOI, MD[3000], RISE_PIPS2; static double MS[3000], askprev, bidprev, hand_point, PLANCA, DAY_MIN, DAY_MAX, PREV[6]; static datetime MDL[3000], PL_UP, PL_DN, TEST_SECOND, WAITING, LOGGING, TAK; static int TRADE_SHIFT_ON_STOP, ORDERLIFE_ON_TURN_STOP, TRADE_SHIFT_REV; static int q1, q2, q3; static int Treasure, ND, MAX_TPS, MIN_TPS, LOSS_INSPECTION; static bool First_Time, TPS_Agree, TPS_Agree2, DELETE_PENDINGS_ORDERS, First_Time2, AG_DEPTH, already_reported; static int MAX_LOSS, TRADE_SHIFT, CHANNEL_OLD2; static int MAX_POINT, CHECK_SECOND; static int LIVES_UP, LIVES_DN, LEVEL, FOUND, TICKER; static int SMART_PROFIT_SELECT, TRADE_CONTROL, IMPULSE_WAIT, ORDERLIFE_REV, CRUSER_MODE, bytesread[1], lo[1], IOS; static double DAT[]; int OnInit() { int q, j, z, r=0, de; string file_of_lag, st; datetime ttl; MqlDateTime stru; if (MAGIC_NUMBER>0) s5=DoubleToString(MAGIC_NUMBER,0)+"_"; else s5=""; st="TRADE_START_GLOBAL"; if (!GlobalVariableCheck(st)) GlobalVariableSet(st, 0); z=300; r=-1; while (r<61 && z>0) {r=ArrayResize(DAT,61); z--;} ArrayInitialize(DAT, -1000); no_worked=false; ORIGIN=false; First_Time2=true; s2=Symbol(); ttl=TimeLocal(); TimeToStruct(ttl,stru); Treasure=stru.hour+stru.day+stru.min+stru.sec+stru.mon; z=StringLen(s2); if (z>6) s3=StringSubstr(s2, 0, 6); else s3=s2; if (MWORK!=0) { file_of_lag="q_result_"+s3+".lag"; q=FileOpen(file_of_lag, FILE_BIN|FILE_READ); if (q!=-1) { z=200; j=-1; while (j!=60 && z>0) {j=FileReadArray(q, DAT, 1, 60); z--;} if (FileSize(q)>480) TEST_SECOND=FileReadInteger(q, INT_VALUE); else TEST_SECOND=0; FileClose(q); z=DAT[42]; if (z==11 || z==12) DELETE_PENDINGS_ORDERS=false; else DELETE_PENDINGS_ORDERS=true; DAT[42]=DELETE_PENDINGS_ORDERS; if (j==60) { GlobalVariableSet(s5+"z_"+s3+"_txt",-1); GlobalVariableSet(s5+"z_"+s3+"_ans",-1); GlobalVariableSet(s5+"z_"+s3+"_crc",-1); Print ("найден Чистовик (Found Origin)"); if (TEST_SECOND>0) Print ("дата создания чистовика тестером: "+TimeToString(TEST_SECOND,TIME_DATE|TIME_MINUTES|TIME_SECONDS)); StartRetreive(); ORIGIN=true; Print ("IMPULSE WAIT [0...20]=",DAT[58]); } } if (!ORIGIN) { Print("Чистовик не найден - робот торговать не будет"); if (MWORK==1) return(0); else no_worked=true; } z=300; r=-1; while (r<60 && z>0) {r=ArrayResize(VAR_NAME, 60); z--;} VAR_NAME[33]="WAITING TIME IN SECONDS [0...>]"; VAR_NAME[22]="MG DEPTH IN DEPOSIT [1...>]"; VAR_NAME[31]="MINIMAL PROFIT [0-Disabled, 1...>]"; VAR_NAME[30]="ANALIZE TICK"; VAR_NAME[29]="TRADE SHIFT 2 [1...>]"; VAR_NAME[27]="TRAILING STOP FIRST [1...>]"; VAR_NAME[28]="TRAILING STOP [1...>]"; VAR_NAME[34]="ONE DAY SHIFT [1...>]"; VAR_NAME[26]="ORDER LIFE [0-Disabled, 1...>]"; VAR_NAME[25]="ONE DAY LIFE [0-Disabled, 1...>]"; VAR_NAME[24]="IMPULSE SHIFT 2 [1...>]"; VAR_NAME[23]="RISE PIPS [2...>]"; VAR_NAME[32]="RISE PIPS OLD [2...>]"; VAR_NAME[18]="TRADE SHIFT [1...>]"; VAR_NAME[35]="CUT PERCENT"; VAR_NAME[1]="CLOSING ATTEMPTS [1...10]"; VAR_NAME[2]="IMPULSE LIFE [0-Disabled, 1...>]"; VAR_NAME[3]="IMPULSE SHIFT [0...>]"; VAR_NAME[4]="TRAIL SUBMODE [1...7]"; VAR_NAME[5]="TRAILING PIPS [1...>]"; VAR_NAME[6]="CHANNEL FRESH [1...>]"; VAR_NAME[36]="CRUSER MIN DEPO [1...>]"; VAR_NAME[37]="TRADE CONTROL ZOOM [0-Disabled, 0...>]"; VAR_NAME[8]="CRUSER LOT INCREASE"; VAR_NAME[7]="CRUSER MAX LOT ZOOM [1...>]"; VAR_NAME[9]="CRUSER SAFE AREA IN PIPS [1...>]"; VAR_NAME[11]="MG Engine [0/1]"; VAR_NAME[12]="MAXIMAL SIZE OF LOT"; VAR_NAME[13]="IMPULSE [1..45]"; VAR_NAME[14]="(PRC)CANDLE WAITING [0-Disabled, 1...7200]"; VAR_NAME[20]="MAX TPS [0-Disabled, 1...>]"; VAR_NAME[21]="DIGITS"; VAR_NAME[16]="ACCOUNT LIVERAGE"; VAR_NAME[17]="USE FIVE DIGITS [0/1]"; VAR_NAME[10]="ACCOUNT TICKVALUE"; VAR_NAME[15]="ACCOUNT LOTSTEP"; VAR_NAME[19]="SPREAD ON YOUR TRADE TERMINAL (0-AUTO)"; VAR_NAME[38]="ONE DAY SHIFT 2 [1...>]"; VAR_NAME[39]="ORDER LIFE 2 [0-Disabled, 1...>]"; VAR_NAME[40]="MAX LOSS IN DEPOSIT [1...>]"; VAR_NAME[41]="(PRC) SUBMODE [1...7]"; VAR_NAME[42]="RECHECK DIRECTION AFTER WAITING [0/1]"; VAR_NAME[43]="LOT SIZE IN PERCENT"; VAR_NAME[44]="ANALIZE TICK 2 [3...>]"; VAR_NAME[45]="ONE DAY LIFE 2"; VAR_NAME[46]="MG TRADE ALLOW [0/1]"; VAR_NAME[47]="USE TRAILING STOP FIRST [0/1]"; VAR_NAME[48]="MARGIN REQUIRED"; VAR_NAME[49]="MINIMAL OF LOT"; VAR_NAME[50]="MIN TPS [0-Disabled, 1...>]"; VAR_NAME[51]="ORIGIN PROFIT"; VAR_NAME[52]="CHANNEL OLD"; VAR_NAME[53]="USE LIMIT ORDERS ON RISE [0/1]"; VAR_NAME[54]="LEVEL WAITING IN SECONDS"; if (DAT[27]>DAT[28]) { de=DAT[28]; DAT[28]=DAT[27]; DAT[27]=de; } Print (""); z=300; r=-1; while (r!=TICKS_ALL+1 && z>0) {r=ArrayResize(PIP, TICKS_ALL+1); z--;} z=300; r=-1; while (r!=TRADE_SHIFT_ON_STOP+1 && z>0) {r=ArrayResize(PIP2, TRADE_SHIFT_ON_STOP+1); z--;} Agree=ORIGIN; if (!no_worked) { for (z=1; z<55; z++) if (VAR_NAME[z]!="" && z!=10) { st=VAR_NAME[z]; Print (st+"=",DAT[z]); if (GlobalVariableCheck("___"+st)) GlobalVariableDel ("___"+st); } if (GlobalVariableCheck("____Ok")) GlobalVariableDel("____Ok"); } if (!no_worked) { Print("Робот запущен (экспортёр сигналов v.3.11 SN)"); if (MWORK!=1) Print("Началась запись тиков"); First_Time=true; } else Print("Началась запись тиков"); LOGGING=TimeLocal()+10; askprev=SymbolInfoDouble(s2,SYMBOL_ASK); bidprev=SymbolInfoDouble(s2,SYMBOL_BID); MOI=1; LIVES_UP=MAX_POINT; LIVES_DN=MAX_POINT; if (CHECK_SECOND==0) z=-1; else z=0; PL_UP=z; PL_DN=z; TPS_Agree=true; TPS_Agree2=true; ArrayInitialize(PIP, -1); ArrayInitialize(FREE,true); if (TerminalInfoInteger(TERMINAL_CONNECTED)) Digits_now=_Digits; else Digits_now=ND; if (ORIGIN && ND!=Digits_now) Print ("кол-во знаков после точки не совпадает с чистовиком =",ND); hand_point=_Point; if (hand_point==0) hand_point=SymbolInfoDouble(s2, SYMBOL_POINT); if (hand_point==0) hand_point=1/MathPow(10,Digits_now); if (!no_worked) { j=30; z=-1; while (z==-1 && j>0) {z=FileOpen(s3+s5+".tmp", FILE_BIN|FILE_READ); j--;} if (z!=-1) { j=FileReadArray (z, PREV, 1, 5); FileClose(z); if (j>3) { ttl=MathAbs(TimeLocal()-PREV[5]); if (ttl0) {q1=FileOpen(s3+".ASK",FILE_BIN|FILE_READ|FILE_WRITE); z--;} q2=-1; z=250; while (q2==-1 && z>0) {q2=FileOpen(s3+".BID",FILE_BIN|FILE_READ|FILE_WRITE); z--;} q3=-1; z=250; while (q3==-1 && z>0) {q3=FileOpen(s3+".DAT",FILE_BIN|FILE_READ|FILE_WRITE); z--;} if (q1*q2*q3<=0) { Print ("Не получилось открыть файлы для записи тиков"); if (MWORK==0) {Agree=false; Print ("ОСТАНОВИТЕ РАБОТУ СОВЕТНИКА!");} } } already_reported=false; TAK=TimeLocal(); TICKER=0; Print ("Treasure=",Treasure); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { string sy; if (ORIGIN) { sy=s5+"z_"+s3+"_txt"; if (GlobalVariableCheck(sy)) GlobalVariableDel(sy); sy=s5+"z_"+s3+"_ans"; if (GlobalVariableCheck(sy)) GlobalVariableDel(sy); sy=s5+"z_"+s3+"_crc"; if (GlobalVariableCheck(sy)) GlobalVariableDel(sy); } if (MWORK!=1) { FileClose(q1); FileClose(q2); FileClose(q3); } } void OnTick() { double LG, LG0, ask0, bid0, order_SL, W, W_P; int Lag_value, answer, DI, t, ii, WWW, U, L, ot, lp, CMD, CMD2, col, t_z, xe, Export_file, valb; bool what, MG_NOW_CREATE, PIP_complete; datetime THE_DATETIME, RDL; bool dir_a, dir_b, need_close; ask0=SymbolInfoDouble(s2,SYMBOL_ASK); LG=ask0-askprev; bid0=SymbolInfoDouble(s2,SYMBOL_BID); LG0=bid0-bidprev; THE_DATETIME=TimeLocal(); if (THE_DATETIME>LOGGING && !First_Time2) { lp=FileOpen(s3+s5+".tmp", FILE_BIN|FILE_WRITE); if (lp!=-1) { PREV[1]=DAY_MIN; PREV[2]=DAY_MAX; PREV[3]=WAITING; PREV[5]=THE_DATETIME; t=FileWriteArray(lp, PREV, 1, 5); FileClose(lp); } else if (!already_reported) { Print ("не получилось записать промежуточные параметры режима <Суточные уровни> в файл <"+s3+s5+".tmp>"); already_reported=true; } LOGGING=THE_DATETIME+10; } RDL=THE_DATETIME-TAK; TICKER++; if (MIN_TPS>0 && TICKER>=MIN_TPS && RDL<2) TPS_Agree2=true; else TPS_Agree2=false; if (MAX_TPS>0 && TICKER<=MAX_TPS && RDL>0) TPS_Agree=true; else TPS_Agree=false; if (RDL>0) {TICKER=0; TAK=THE_DATETIME;} if (LG!=0 || (LG0!=0 && SPREAD_CONST==0)) { if (First_Time2 && ask0>0) {DAY_MIN=ask0; DAY_MAX=ask0; WAITING=THE_DATETIME+SMART_PROFIT_SELECT; First_Time2=false;} Lag_value=Point_DBL_to_INT(NormalizeDouble(LG, Digits_now)); if (SPREAD_CONST==0) { valb=Point_DBL_to_INT(NormalizeDouble(LG0,Digits_now)); if (Lag_value<0) dir_a=true; else dir_a=false; if (valb<0) dir_b=true; else dir_b=false; if (Lag_value*valb==0 || Lag_value==valb) { if (Lag_value==0) Lag_value=valb; } else { ot=MathAbs(Lag_value); xe=MathAbs(valb); if (dir_a==dir_b) Lag_value=MathMax(ot,xe); else { if (ot!=xe) { if (ot>xe) Lag_value=ot-xe; else {Lag_value=xe-ot; dir_a=dir_b;} } else Lag_value=0; } if (dir_a) Lag_value*=-1; } } if (!no_worked && MWORK!=0 && Lag_value!=0 && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && TerminalInfoInteger(TERMINAL_CONNECTED)) { PIP[TICKS_ALL]=Lag_value; PIP2[TRADE_SHIFT_ON_STOP]=Lag_value; PIP_complete=true; U=0; for (t=1; t<=TRADE_SHIFT_ON_STOP; t++) { ot=PIP2[t]; if (ot==-1) {PIP_complete=false; if (t!=TRADE_SHIFT_ON_STOP) break;} else U+=ot; } if (THE_DATETIME>WAITING) { what=false; if (ask0>DAY_MAX) { CMD=1; CMD2=4; what=true; DAY_MAX=ask0; } else if (ask00) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD; MDL[L]=THE_DATETIME+MG_ZOOM; MS[L]=GetShift(CMD, TRADE_SHIFT_LIM, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } if (ORDERLIFE_ON_TURN_STOP>0) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD2; MDL[L]=THE_DATETIME+ORDERLIFE_ON_TURN_STOP; MS[L]=GetShift(CMD2, MAX_POINT, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } } } if (PIP_complete) { lp=FOUND; if (lp==0) { ot=MathAbs(U); if (ot<=TRADE_CONTROL && ot>1) { if (U>0) xe=1; else xe=-1; t_z=ot/2; W=t_z*hand_point*xe; PLANCA=ask0+W; FOUND=xe; } } else if (MathAbs(lp)==1) { LG=ask0-PLANCA; col=Point_DBL_to_INT(LG); if (col>0) { FOUND*=2; LEVEL=IMPULSE_WAIT; } } else { if (LEVEL<1) { ot=MathAbs(U); if (ot<=TRADE_CONTROL && ot>1) { DI=FOUND/2; if (DI>0) MG_NOW_CREATE=true; else MG_NOW_CREATE=false; CMD=4+MG_NOW_CREATE; CMD2=!MG_NOW_CREATE; if (MATCH_LIMIT_ORDERS>0) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD; MDL[L]=THE_DATETIME+MATCH_LIMIT_ORDERS; MS[L]=GetShift(CMD, LOSS_INSPECTION, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } if (TRADE_SHIFT_REV>0) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD2; MDL[L]=THE_DATETIME+TRADE_SHIFT_REV; MS[L]=GetShift(CMD2, ORDERLIFE_REV, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } } FOUND=0; } else LEVEL--; } } what=true; for (t=1; t<=TICKS_ALL; t++) if (PIP[t]==-1) {what=false; if (t!=TICKS_ALL) break;} if (what) { U=0; ot=0; CMD=0; lp=NormalizeDouble(TICKS_ALL*PERCENT_OF_CUT/100,0); for (t=TICKS_ALL; t>lp; t--) {U+=PIP[t]; ot+=PIP[t-lp];} if (U>0) PIP_complete=true; else PIP_complete=false; if (ot>0) MG_NOW_CREATE=true; else MG_NOW_CREATE=false; lp=MathAbs(U); ii=MathAbs(ot); if (lp>RISE_VECTOR && lpRISE_PIPS2 && ii0) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD; MDL[L]=THE_DATETIME+ORDERLIFE; MS[L]=GetShift(CMD, TRADE_SHIFT, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } if (CHECK_SECOND>0) { xe=MOI; L=1; while (!FREE[L]) L++; MD[L]=CMD2; MDL[L]=THE_DATETIME+CHECK_SECOND; MS[L]=GetShift(CMD2, ORDERLIFE_LIM, ask0, bid0); FREE[L]=false; WAIT[L]=false; if (L>=xe) MOI=L+1; } } } DI=1; if (MOI>1) { for (t=1; tTHE_DATETIME) { if ((MIN_TPS==0 || TPS_Agree2) && (MAX_TPS==0 || TPS_Agree)) { order_SL=MS[t]; WWW=MD[t]; lp=WWW; if (WWW>1) WWW-=4; if (lp<2) {if (lp==0) W_P=ask0; else W=bid0;} else if (lp==4) W_P=bid0; else W=ask0; if ((W>=order_SL && WWW==1) || (W_P<=order_SL && WWW==0)) { if (DELETE_PENDINGS_ORDERS && WAIT[t]) WWW=!PIP_complete; else if (lp>1) WWW=1-WWW; Direction[DI]=WWW; MMM0[DI]=t; DI++; } } else if (DELETE_PENDINGS_ORDERS) WAIT[t]=true; } else FREE[t]=true; } } if (Agree && DI>1) { for (t=1; t-1) { answer=-1; what=false; if (!GlobalVariableCheck(s5+"z_"+s3+"_ans")) GlobalVariableSet(s5+"z_"+s3+"_ans",-1); else if (!First_Time) answer=GlobalVariableGet(s5+"z_"+s3+"_ans"); if (First_Time || answer==Treasure) what=true; if (what) { if (First_Time) First_Time=false; if (MMM0[t]>0) FREE[MMM0[t]]=true; if (answer>-1) GlobalVariableSet(s5+"z_"+s3+"_ans",0); Direction[t]=-1; GlobalVariableSet(s5+"z_"+s3+"_txt",WWW+1); GlobalVariableSet(s5+"z_"+s3+"_crc",Treasure); } } if (what && GlobalVariableGet("TRADE_START_GLOBAL")==0) { GlobalVariableSet("TRADE_START_GLOBAL", 1); PlaySound("ringin.wav"); } } } askprev=ask0; if (SPREAD_CONST==0) bidprev=bid0; L=MathMax(TICKS_ALL, TRADE_SHIFT_ON_STOP); for (ii=2; ii<=L; ii++) { if (ii<=TICKS_ALL) PIP[ii-1]=PIP[ii]; if (ii<=TRADE_SHIFT_ON_STOP) PIP2[ii-1]=PIP2[ii]; } } } if (MWORK!=1) { FileSeek(q1, 0, SEEK_END); FileWriteDouble (q1,(double)ask0); FileSeek(q2, 0, SEEK_END); FileWriteDouble (q2,(double)bid0); FileSeek(q3, 0, SEEK_END); if (USE_LOCAL_TIME==1) THE_DATETIME=TimeLocal(); else THE_DATETIME=TimeCurrent(); FileWriteInteger(q3, THE_DATETIME, INT_VALUE); } } // ПОДПРОГРАММЫ: int Point_DBL_to_INT(double chk) { string st, sq; int sf, sl, sqt; st=DoubleToString(chk, Digits_now); sf=StringFind(st, ".", 0)+1; sq=StringSubstr(st, 0, sf-1); sqt=StringToInteger(sq); if (sf==0) return (chk); sl=StringLen(st)-1; st=StringSubstr(st, sf, sl); if (sqt!=0) sf=StringToInteger(sq+st); else { sf=StringToInteger(st); if (chk<0) sf=-sf; } return (sf); } double GetShift(int CMD0, int W1, double ask1, double bid1) { double bsd; if (CMD0==0 || CMD0==4) bsd=ask1-W1*hand_point; else bsd=bid1+W1*hand_point; return (bsd); } void StartRetreive() { DAT[22]=MathAbs(DAT[22]); DAT[48]=MathAbs(DAT[48]); SMART_PROFIT_SELECT=DAT[54]; TRADE_CONTROL=DAT[13]; IMPULSE_WAIT=DAT[58]; ORDERLIFE_REV=DAT[24]; CRUSER_MODE=DAT[6]; MAX_POINT=DAT[38]; MATCH_LIMIT_ORDERS=DAT[2]; LOSS_INSPECTION=DAT[3]; TRADE_SHIFT_LIM=DAT[34]; RISE_PIPS2=DAT[32]; TICKS_ALL=DAT[30]; ORDERLIFE_LIM=DAT[29]; ORDERLIFE=DAT[26]; RISE_VECTOR=DAT[23]; ND=DAT[21]; MAX_TPS=DAT[20]; MG_ZOOM=DAT[25]; DELETE_PENDINGS_ORDERS=DAT[42]; TRADE_SHIFT=DAT[18]; PERCENT_OF_CUT=DAT[35]; CHECK_SECOND=DAT[39]; TRADE_SHIFT_ON_STOP=DAT[44]; ORDERLIFE_ON_TURN_STOP=DAT[45]; MIN_TPS=DAT[50]; CHANNEL_OLD2=DAT[52]; AG_DEPTH=DAT[53]; TRADE_SHIFT_REV=DAT[56]; Print ("Прибыль чистовика="+DoubleToString(DAT[51],2)); return; }