Привет всем трейдерам ! :roll:
написал индюка, но есть 1 проблема:
я не умею рисовать
что делает этот индикатор: проверяет завышение цены за уровни и предупреждает об этом (вам поможет клавиша "F3")
просьба: помогите сделать (видоизменить его) в пользу вырисовывния трендовых линий, согласно данным индикатора
P.S.: этот индикатор теперь работает у меня в проекте ("тестер с роботами")
скачать можно тут (переименуйте его в MQ4): Посмотреть вложение 11316
вот его код (модератор поможет всё правильно оформить):
#property copyright " * * * John Doe * * * " // проверка исторических минимумов / максимумов
#property link "https://youtu.be/A9p9RxFYHOQ"
extern string mv="глубина проверки железных уровней в днях";
extern int SUPER_LEVEL_DEPTH_IN_DAYS=70;
extern string sv="глубина проверки уровней в днях";
extern int LEVEL_DEPTH_IN_DAYS=7;
extern string mw="5-ти знаковый брокер [1/0]:";
extern bool five=false;
static string s2, HID[2]={"минимумам","максимумам"};
static double FBM;
static int HBR;
void init()
{
int de=1, de0, Digits_now, tck, SAS, dir, dir0, LMC, LMC0, SLM, SLM0, res1, out;
double GLM, SS, hand_point, W, W1, W2, ask0, bid0, ML, MH;
datetime TTL, DT=0;
bool ZARID, try=false, ferrum, ferrum2;
string st, st1, st2, st3, st4, st5, r;
string ONOFF[2]={"запрещены","разрешены"};
string MODES[4]={"","обычный","железобетонный","разрешённый"};
string FERRO[2]={"",", цена в железобетонном уровне"};
string FERR[2]={"",", цена в глобальном уровне"};
//---------------------
tck=2000; Digits_now=0; while (Digits_now<=0 && tck>0) {Digits_now=MarketInfo(s2, MODE_DIGITS); tck--; Sleep(5);}
if (Digits_now<=0) {Print ("Digits=0 - робот работать не будет"); return;}
hand_point=Point;
if (hand_point==0) hand_point=MarketInfo(s2, MODE_POINT);
if (hand_point==0) hand_point=1/MathPow(10,Digits_now);
s2=Symbol();
if (StringSubstr(s2,3,3)=="ZAR") ZARID=true; else ZARID=false;
st="__History_deepth_(0-Exit)";
st1="_ASK";
st2="_BID";
st3="_DIRECTION_[0-BUY/1-SELL]";
st4="_LEVEL_MAX_CROSS";
st5="_STRONG_LEVEL_MODE [0/1]";
//---------------------------------------------------------------------------------------------------------
// первая принудительная прокрутка истории в терминале ОБЯЗАТЕЛЬНО СКОПИРОВАТЬ В БЛОК Init() RECEIVER'а
SS=0; tck=2000; SAS=MathMax(SUPER_LEVEL_DEPTH_IN_DAYS,LEVEL_DEPTH_IN_DAYS);
while (SS==0 && tck>0)
{
SS=iLow(s2,1440,SAS);
tck--;
Sleep (3);
}
//---------------------------------------------------------------------------------------------------------
while (de>0)
{
TTL=TimeLocal();
if (DT>TTL)
{
if (GlobalVariableCheck(st)) de=GlobalVariableGet(st); else {de=LEVEL_DEPTH_IN_DAYS; GlobalVariableSet(st,de);}
//---------------------------------------------------------------
if (de<7) SAS=de*2; else SAS=de+1;
if (SAS<4) SAS=4; else if (SAS>12) SAS=12;
if (five && !ZARID) {SAS*=10; W=3.7;} else if (ZARID) {W=2; if (five) SAS*=100; else SAS*=65;}
SS=hand_point*SAS;
//---------------------------------------------------------------
ferrum=false;
ferrum2=false;
if (dir==0)
{
MH=iHigh(s2,1440,de);
GLM=iGlobal(de,1-dir,ask0,ZARID,SS,W); // универсальная команда, возвращающая также железный уровень и кол-во часовых пробитий за 7 дней
Print (r+"за "+DoubleToStr(de,0)+" дней: глобальный максимум="+DoubleToStr(GLM,Digits));
Print ("железобетонный максимум="+DoubleToStr(FBM,Digits));
Print ("почасовых пробитий для максимума="+DoubleToStr(HBR,0));
if (ask0>=FBM) ferrum=true;
if (ask0>=GLM) ferrum2=true;
}
else
{
ML=iLow(s2,1440,de);
GLM=iGlobal(de,1-dir,bid0,ZARID,SS,W); // GLM=iGlobal(de,1,1.1340); // -- // -- // -- //
Print (r+"за "+DoubleToStr(de,0)+" дней: глобальный минимум="+DoubleToStr(GLM,Digits));
Print ("железобетонный минимум="+DoubleToStr(FBM,Digits));
Print ("почасовых пробитий для минимума="+DoubleToStr(HBR,0));
if (bid0<=FBM) ferrum=true;
if (bid0<=GLM) ferrum2=true;
}
if (!try) r=""; else r="(повтор): ";
if (!try && ((dir==1 && ML==0) || (dir==0 && MH==0))) {DT=TTL+2; try=true; Print ("ошибка функции N_"+GetLastError());} else {DT=0; try=false;}
//------------------------------------------- здесь определяется направление создания ордера и результат: можно/нельзя:
res1=0; // res1: 1-обычный, 2-железобетонный, 3-разрешённый
if (HBR==0 || ferrum) res1=2; // 2-железобетонный
if (res1==0)
{
if (HBR<=LMC) res1=1; else res1=3; // 1-обычный else 3-разрешённый
}
//------------------------------------------------------------
out=0;
if (res1==1) // 1-обычный
{
if (SLM==1 || ferrum2) out=0; else out=1;
}
if (out==0)
{
if (res1==2) out=0; else if (res1==3 && !ferrum2) out=1;
}
Print ("РЕЗУЛЬТАТЫ: режим="+MODES[res1]+FERRO[ferrum]+FERR[ferrum2]+", итого торги "+ONOFF[out]+"!");
//------------------------------------------------------------------------------------------------------------------------
}
else
{
if (GlobalVariableCheck(st))
{
de=GlobalVariableGet(st);
if (de!=de0) {DT=TTL+2; de0=de;}
}
else {de=LEVEL_DEPTH_IN_DAYS; GlobalVariableSet(st,de);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st1))
{
ask0=GlobalVariableGet(st1);
if (ask0!=W1) {DT=TTL+2; W1=ask0;}
}
else {ask0=MarketInfo(s2,MODE_ASK); GlobalVariableSet(st1,ask0);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st2))
{
bid0=GlobalVariableGet(st2);
if (bid0!=W2) {DT=TTL+2; W2=bid0;}
}
else {bid0=MarketInfo(s2,MODE_BID); GlobalVariableSet(st2,bid0);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st3))
{
dir=GlobalVariableGet(st3);
if (dir!=dir0) {DT=TTL+2; dir0=dir;}
}
else {dir=0; GlobalVariableSet(st3,dir);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st4))
{
LMC=GlobalVariableGet(st4);
if (LMC!=LMC0) {DT=TTL+2; LMC0=LMC;}
}
else {LMC=4; GlobalVariableSet(st4,LMC);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st5))
{
SLM=GlobalVariableGet(st5);
if (SLM!=SLM0) {DT=TTL+2; SLM0=SLM;}
}
else {SLM=1; GlobalVariableSet(st5,SLM);}
//-----------------------------------------------------------
Sleep (10);
}
}
if (GlobalVariableCheck(st)) GlobalVariableDel(st);
}
void deinit()
{
return;
}
void start()
{
return;
}
double iGlobal(int d0, bool high_ID, double price, bool ZAR, double shift0, double zuma_W)
{
int i0, imax, imax2, att, re, SLD;
int i1, i2;
double x0, found1, found2;
//-----------------------------------// found1 - за 7 дней, found2 - за 60 дней
imax=d0*24; // 7*24=168
imax2=imax;
if (ZAR) SLD=SUPER_LEVEL_DEPTH_IN_DAYS/4; else SLD=SUPER_LEVEL_DEPTH_IN_DAYS;
if (imax2<SLD) imax2=SLD;
HBR=0;
if (high_ID) {found1=0; found2=0;} else {found1=99999; found2=99999;}
for (i0=0; i0<=imax2; i0++)
{
x0=0; att=93;
while (x0==0 && att>0)
{
if (high_ID)
{
x0=iHigh(s2,1440,i0); // дневной максимум
if (x0!=0)
{
if (i0<=SLD) i1=i0;
if (x0>found1 && i0<=d0) found1=x0;
if (x0>found2 && i0<=SLD) found2=x0;
}
x0=iHigh(s2,60,i0); // часовой максимум
if (x0!=0) i2=i0;
if (i0<=imax && x0>=price && price>=iLow(s2,60,i0)) re++;
}
else
{
x0=iLow(s2,1440,i0); // дневной минимум
if (x0!=0)
{
if (i0<=SLD) i1=i0;
if (x0<found1 && i0<=d0) found1=x0;
if (x0<found2 && i0<=SLD) found2=x0;
}
x0=iLow(s2,60,i0); // часовой минимум
if (x0!=0) i2=i0;
if (i0<=imax && x0<=price && price<=iHigh(s2,60,i0) && x0!=0) re++;
}
if (x0==0) att--;
}
}//for (i0=0; i0<=imax2; i0++)
//----------------------------------------------------
if (high_ID) {found1-=shift0; FBM=found2-shift0*zuma_W;} else {found1+=shift0; FBM=found2+shift0*zuma_W;}
HBR=re;
//----------------------------------------
if (i2<imax) Print ("фактически удалось собрать только за "+DoubleToStr(i2,0)+" часов истории по "+HID[high_ID]);
if (i1<SLD) Print ("фактически удалось собрать только за "+DoubleToStr(i1,0)+" дней истории по "+HID[high_ID]);
return (found1);
}
написал индюка, но есть 1 проблема:
я не умею рисовать
что делает этот индикатор: проверяет завышение цены за уровни и предупреждает об этом (вам поможет клавиша "F3")
просьба: помогите сделать (видоизменить его) в пользу вырисовывния трендовых линий, согласно данным индикатора
P.S.: этот индикатор теперь работает у меня в проекте ("тестер с роботами")
скачать можно тут (переименуйте его в MQ4): Посмотреть вложение 11316
вот его код (модератор поможет всё правильно оформить):
#property copyright " * * * John Doe * * * " // проверка исторических минимумов / максимумов
#property link "https://youtu.be/A9p9RxFYHOQ"
extern string mv="глубина проверки железных уровней в днях";
extern int SUPER_LEVEL_DEPTH_IN_DAYS=70;
extern string sv="глубина проверки уровней в днях";
extern int LEVEL_DEPTH_IN_DAYS=7;
extern string mw="5-ти знаковый брокер [1/0]:";
extern bool five=false;
static string s2, HID[2]={"минимумам","максимумам"};
static double FBM;
static int HBR;
void init()
{
int de=1, de0, Digits_now, tck, SAS, dir, dir0, LMC, LMC0, SLM, SLM0, res1, out;
double GLM, SS, hand_point, W, W1, W2, ask0, bid0, ML, MH;
datetime TTL, DT=0;
bool ZARID, try=false, ferrum, ferrum2;
string st, st1, st2, st3, st4, st5, r;
string ONOFF[2]={"запрещены","разрешены"};
string MODES[4]={"","обычный","железобетонный","разрешённый"};
string FERRO[2]={"",", цена в железобетонном уровне"};
string FERR[2]={"",", цена в глобальном уровне"};
//---------------------
tck=2000; Digits_now=0; while (Digits_now<=0 && tck>0) {Digits_now=MarketInfo(s2, MODE_DIGITS); tck--; Sleep(5);}
if (Digits_now<=0) {Print ("Digits=0 - робот работать не будет"); return;}
hand_point=Point;
if (hand_point==0) hand_point=MarketInfo(s2, MODE_POINT);
if (hand_point==0) hand_point=1/MathPow(10,Digits_now);
s2=Symbol();
if (StringSubstr(s2,3,3)=="ZAR") ZARID=true; else ZARID=false;
st="__History_deepth_(0-Exit)";
st1="_ASK";
st2="_BID";
st3="_DIRECTION_[0-BUY/1-SELL]";
st4="_LEVEL_MAX_CROSS";
st5="_STRONG_LEVEL_MODE [0/1]";
//---------------------------------------------------------------------------------------------------------
// первая принудительная прокрутка истории в терминале ОБЯЗАТЕЛЬНО СКОПИРОВАТЬ В БЛОК Init() RECEIVER'а
SS=0; tck=2000; SAS=MathMax(SUPER_LEVEL_DEPTH_IN_DAYS,LEVEL_DEPTH_IN_DAYS);
while (SS==0 && tck>0)
{
SS=iLow(s2,1440,SAS);
tck--;
Sleep (3);
}
//---------------------------------------------------------------------------------------------------------
while (de>0)
{
TTL=TimeLocal();
if (DT>TTL)
{
if (GlobalVariableCheck(st)) de=GlobalVariableGet(st); else {de=LEVEL_DEPTH_IN_DAYS; GlobalVariableSet(st,de);}
//---------------------------------------------------------------
if (de<7) SAS=de*2; else SAS=de+1;
if (SAS<4) SAS=4; else if (SAS>12) SAS=12;
if (five && !ZARID) {SAS*=10; W=3.7;} else if (ZARID) {W=2; if (five) SAS*=100; else SAS*=65;}
SS=hand_point*SAS;
//---------------------------------------------------------------
ferrum=false;
ferrum2=false;
if (dir==0)
{
MH=iHigh(s2,1440,de);
GLM=iGlobal(de,1-dir,ask0,ZARID,SS,W); // универсальная команда, возвращающая также железный уровень и кол-во часовых пробитий за 7 дней
Print (r+"за "+DoubleToStr(de,0)+" дней: глобальный максимум="+DoubleToStr(GLM,Digits));
Print ("железобетонный максимум="+DoubleToStr(FBM,Digits));
Print ("почасовых пробитий для максимума="+DoubleToStr(HBR,0));
if (ask0>=FBM) ferrum=true;
if (ask0>=GLM) ferrum2=true;
}
else
{
ML=iLow(s2,1440,de);
GLM=iGlobal(de,1-dir,bid0,ZARID,SS,W); // GLM=iGlobal(de,1,1.1340); // -- // -- // -- //
Print (r+"за "+DoubleToStr(de,0)+" дней: глобальный минимум="+DoubleToStr(GLM,Digits));
Print ("железобетонный минимум="+DoubleToStr(FBM,Digits));
Print ("почасовых пробитий для минимума="+DoubleToStr(HBR,0));
if (bid0<=FBM) ferrum=true;
if (bid0<=GLM) ferrum2=true;
}
if (!try) r=""; else r="(повтор): ";
if (!try && ((dir==1 && ML==0) || (dir==0 && MH==0))) {DT=TTL+2; try=true; Print ("ошибка функции N_"+GetLastError());} else {DT=0; try=false;}
//------------------------------------------- здесь определяется направление создания ордера и результат: можно/нельзя:
res1=0; // res1: 1-обычный, 2-железобетонный, 3-разрешённый
if (HBR==0 || ferrum) res1=2; // 2-железобетонный
if (res1==0)
{
if (HBR<=LMC) res1=1; else res1=3; // 1-обычный else 3-разрешённый
}
//------------------------------------------------------------
out=0;
if (res1==1) // 1-обычный
{
if (SLM==1 || ferrum2) out=0; else out=1;
}
if (out==0)
{
if (res1==2) out=0; else if (res1==3 && !ferrum2) out=1;
}
Print ("РЕЗУЛЬТАТЫ: режим="+MODES[res1]+FERRO[ferrum]+FERR[ferrum2]+", итого торги "+ONOFF[out]+"!");
//------------------------------------------------------------------------------------------------------------------------
}
else
{
if (GlobalVariableCheck(st))
{
de=GlobalVariableGet(st);
if (de!=de0) {DT=TTL+2; de0=de;}
}
else {de=LEVEL_DEPTH_IN_DAYS; GlobalVariableSet(st,de);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st1))
{
ask0=GlobalVariableGet(st1);
if (ask0!=W1) {DT=TTL+2; W1=ask0;}
}
else {ask0=MarketInfo(s2,MODE_ASK); GlobalVariableSet(st1,ask0);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st2))
{
bid0=GlobalVariableGet(st2);
if (bid0!=W2) {DT=TTL+2; W2=bid0;}
}
else {bid0=MarketInfo(s2,MODE_BID); GlobalVariableSet(st2,bid0);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st3))
{
dir=GlobalVariableGet(st3);
if (dir!=dir0) {DT=TTL+2; dir0=dir;}
}
else {dir=0; GlobalVariableSet(st3,dir);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st4))
{
LMC=GlobalVariableGet(st4);
if (LMC!=LMC0) {DT=TTL+2; LMC0=LMC;}
}
else {LMC=4; GlobalVariableSet(st4,LMC);}
//-----------------------------------------------------------
if (GlobalVariableCheck(st5))
{
SLM=GlobalVariableGet(st5);
if (SLM!=SLM0) {DT=TTL+2; SLM0=SLM;}
}
else {SLM=1; GlobalVariableSet(st5,SLM);}
//-----------------------------------------------------------
Sleep (10);
}
}
if (GlobalVariableCheck(st)) GlobalVariableDel(st);
}
void deinit()
{
return;
}
void start()
{
return;
}
double iGlobal(int d0, bool high_ID, double price, bool ZAR, double shift0, double zuma_W)
{
int i0, imax, imax2, att, re, SLD;
int i1, i2;
double x0, found1, found2;
//-----------------------------------// found1 - за 7 дней, found2 - за 60 дней
imax=d0*24; // 7*24=168
imax2=imax;
if (ZAR) SLD=SUPER_LEVEL_DEPTH_IN_DAYS/4; else SLD=SUPER_LEVEL_DEPTH_IN_DAYS;
if (imax2<SLD) imax2=SLD;
HBR=0;
if (high_ID) {found1=0; found2=0;} else {found1=99999; found2=99999;}
for (i0=0; i0<=imax2; i0++)
{
x0=0; att=93;
while (x0==0 && att>0)
{
if (high_ID)
{
x0=iHigh(s2,1440,i0); // дневной максимум
if (x0!=0)
{
if (i0<=SLD) i1=i0;
if (x0>found1 && i0<=d0) found1=x0;
if (x0>found2 && i0<=SLD) found2=x0;
}
x0=iHigh(s2,60,i0); // часовой максимум
if (x0!=0) i2=i0;
if (i0<=imax && x0>=price && price>=iLow(s2,60,i0)) re++;
}
else
{
x0=iLow(s2,1440,i0); // дневной минимум
if (x0!=0)
{
if (i0<=SLD) i1=i0;
if (x0<found1 && i0<=d0) found1=x0;
if (x0<found2 && i0<=SLD) found2=x0;
}
x0=iLow(s2,60,i0); // часовой минимум
if (x0!=0) i2=i0;
if (i0<=imax && x0<=price && price<=iHigh(s2,60,i0) && x0!=0) re++;
}
if (x0==0) att--;
}
}//for (i0=0; i0<=imax2; i0++)
//----------------------------------------------------
if (high_ID) {found1-=shift0; FBM=found2-shift0*zuma_W;} else {found1+=shift0; FBM=found2+shift0*zuma_W;}
HBR=re;
//----------------------------------------
if (i2<imax) Print ("фактически удалось собрать только за "+DoubleToStr(i2,0)+" часов истории по "+HID[high_ID]);
if (i1<SLD) Print ("фактически удалось собрать только за "+DoubleToStr(i1,0)+" дней истории по "+HID[high_ID]);
return (found1);
}