Ваши вопросы по языку MQL4

vladradon

Программист
В моем сове это зовется GlobalShrink - частичное закрытие старейшей минусовой сделки за счет профита по всем парам, в дополнение к Shrink - закрытию в рамках одной пары.
У GlobalShrink есть неприятная особенность для сеточников а-ля Илан - может спровоцировать разрастание сетки по тем парам, у которых забираются плюсовые ордера.
Да, согласен, что такая пакость возможна, поэтому я свою функцию включаю кнопкой в случае необходимости, ну и еще моя функция подсвечивает кнопку на графике зеленым цветом, если не включена и есть возможность эту функцию использовать согласно заданным параметрам.
 

MrGreen86

Гуру форума
Допустим. А как учесть все возможные задержки по времени, связанные с проскальзыванием или еще хуже с реквотами или командами от брокера о временной приостановке торгов? Если уж даже обычные тейкпрофит или стоплосс брокер на срабатывание может задерживать на любое время.

развернутыми проверками. это не такая сложная ситуация чтобы не написать для нее логику.

закроем частично ордер
- успешно - поиск огрызка по последнему тикету (тут без вариантов, новый ордер сразу появится).
- ошибка, проверим есть ли еще ордер который мы хотели закрывать?
-- да есть, RefreshRates(), небольшой sleep и по кругу пробуем снова
-- нет - поиск огрызка (по последнему тикету)

кругов я ставлю 20 штук с задержкой 0.5-1.5 секунды если есть ошибка.
если все 20 кругов будет ошибка и ордер остается живой - тогда на следующем тикете при сохранении условий будут новые попытки частично закрыть ордер.
 

vladradon

Программист
развернутыми проверками. это не такая сложная ситуация чтобы не написать для нее логику.

закроем частично ордер
- успешно - поиск огрызка по последнему тикету (тут без вариантов, новый ордер сразу появится).
- ошибка, проверим есть ли еще ордер который мы хотели закрывать?
-- да есть, RefreshRates(), небольшой sleep и по кругу пробуем снова
-- нет - поиск огрызка (по последнему тикету)

кругов я ставлю 20 штук с задержкой 0.5-1.5 секунды если есть ошибка.
если все 20 кругов будет ошибка и ордер остается живой - тогда на следующем тикете при сохранении условий будут новые попытки частично закрыть ордер.
Я не использую варианты с ограничением по циклу. Они может и отработают в большинстве случаев, но все равно не 100%-е.
 

MrGreen86

Гуру форума
Я не использую варианты с ограничением по циклу. Они может и отработают в большинстве случаев, но все равно не 100%-е.
Отработают, если уметь их готовить. В общем-то ничего 100% не отработает если не ставить проверок.

тут вопрос быстродействия. если у вас маленький советник - можно ковырятся в ордерах и комментариях на каждом тике или ontimer. Если проект большой и советнику необходимо проанализировать тысячи ордеров и принять решение, тут такое решение не годится. mql4 к сожалению не блещет скоростью. Функции работы с закрытыми ордерами очень медленные..
 
Последнее редактирование:

eevviill2

Местный знаток
PHP:
OBJ_ELLIPSE
установим соотношение между временной и ценовой шкалами  
   ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,InpEllipseScale);
Просвятите пожалуйста как это работает. Как мне узнать координату там где знак вопроса?
 

Вложения

  • елі.png
    елі.png
    641 КБ · Просмотры: 39

vladradon

Программист
Отработают, если уметь их готовить. В общем-то ничего 100% не отработает если не ставить проверок.

тут вопрос быстродействия. если у вас маленький советник - можно ковырятся в ордерах и комментариях на каждом тике или ontimer. Если проект большой и советнику необходимо проанализировать тысячи ордеров и принять решение, тут такое решение не годится. mql4 к сожалению не блещет скоростью. Функции работы с закрытыми ордерами очень медленные..
Да, но я стараюсь не использовать зацикленные варианты функций именно из-за задержки, которую они могут привнести. Мои функции если с первого раза не отработали, то запустятся по следующему тику заново. У меня последний сов по объему кода давно перевалил за 2000 строк и работает без тормозов параллельно на любом количестве пар при таком наборе функций, как в кратком описании в файле (выложу еще раз).
 

Вложения

  • ReadmeFX34.txt
    8,3 КБ · Просмотры: 14

AlexeyVik

Программист mql4 mql5
PHP:
OBJ_ELLIPSEустановим соотношение между временной и ценовой шкалами     ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,InpEllipseScale);
Просвятите пожалуйста как это работает. Как мне узнать координату там где знак вопроса?
А ты здесь спроси.
 

vlad_123

Местный знаток
Да, согласен, что такая пакость возможна, поэтому я свою функцию включаю кнопкой в случае необходимости, ну и еще моя функция подсвечивает кнопку на графике зеленым цветом, если не включена и есть возможность эту функцию использовать согласно заданным параметрам.

У меня сов оптимизирован под каждую пару, в т.ч. и возраст ордера, начиная с которого активируется Shrink в рамках ордеров одной пары - получилось от пары недель до 3х месяцев.
GlobalShrink включается при достижении ордером 2x-кратного возраста Shrink.
В исключительных случаях - закрываю один-два убыточных ордера вручную и заношу убыток в GlobalVar типа NeedToEarn_EURUSD, и последующие Shrink/GlobalShrink откусывают как от старейшего ордера, так и от накопленного убытка.
 

Prelagatay

Местный житель
:please:Добрый вечер. Товарищи специалисты, помогите пожалуйста малограмотному. Что прописать в индикаторе что бы он обновлялся с заданным интервалом по вызову его свойств. В сети не нашёл или плохо искал.
 

Prelagatay

Местный житель
Спасибо за подсказку, но не помогло. Пока пользуюсь рефрешером, с ним индикатор работает нормально, но рефрешер дёргает все индикаторы, а мне надо только один.
 

mobidik

-----
Спасибо за подсказку, но не помогло. Пока пользуюсь рефрешером, с ним индикатор работает нормально, но рефрешер дёргает все индикаторы, а мне надо только один.

Раз у Вас открытый код - проще исправить сам код индикатора, нежели лепить рефрешеры. Но предлагать решение, не видя кода, не имеет смысла, это к гадалке.
 

Prelagatay

Местный житель
Вот код:
int start()
{
int CB=IndicatorCounted();
/* It is the optimization option. We have the function here which restore/return the number of counted bars in very special way.
During the first indicator's call we have 0: it is normal because it was not counted anything,
and then we receive the number of bars minus 1. For example, if the number of bars equal 100,
we will have 99. I did it especially, you may see that NB is the number of bars whioch should be counted.
You know we may throw out this parameter. But for the people who understand we may keep it. So, during the first call
of indicator this NB is the same one but during the 2dn etc calls - reducing the value up to the last bar,
That is 1 or 2 for example*/
if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
for (SH=1;SH<NB;SH++)//comb out the chart from 1 to NB
{
for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High-Low);} R/=55;

SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5; UD=SH_SELL; }
if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5; UD=SH_BUY; }
}
return(0);
}
 

vladradon

Программист
Спасибо за подсказку, но не помогло. Пока пользуюсь рефрешером, с ним индикатор работает нормально, но рефрешер дёргает все индикаторы, а мне надо только один.
Если по периоду, то можно так:
PHP:
extern ENUM_TIMEFRAMES InputPeriod=PERIOD_CURRENT;
datetime Top=0;
......
   if(Top==0 || Top!=iTime(_Symbol,InputPeriod,0))
     {
    ...
     //Команды для выполнения по ТФ   InputPeriod
    ...
      Top=iTime(_Symbol,InputPeriod,0);
     }
Или по времени в секундах:
PHP:
extern int TimeWait=60; //Время задержки в секундах
datetime Top=0;
......
   if(TimeCurrent()-Top>TimeWait)
     {
    ...
     //Команды для выполнения по задержке TimeWait
    ...      
      Top=TimeCurrent();
     }
В индикаторе можно все содержимое функции start запихнуть, а в сове команду считывания данных с индикатора iCustom, если я вообще правильно понял, что требуется...
 
Последнее редактирование:

mobidik

-----
Вот код:
int start()
{
int CB=IndicatorCounted();
/* It is the optimization option. We have the function here which restore/return the number of counted bars in very special way.
During the first indicator's call we have 0: it is normal because it was not counted anything,
and then we receive the number of bars minus 1. For example, if the number of bars equal 100,
we will have 99. I did it especially, you may see that NB is the number of bars whioch should be counted.
You know we may throw out this parameter. But for the people who understand we may keep it. So, during the first call
of indicator this NB is the same one but during the 2dn etc calls - reducing the value up to the last bar,
That is 1 or 2 for example*/
if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
for (SH=1;SH<NB;SH++)//comb out the chart from 1 to NB
{
for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High-Low);} R/=55;

SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5; UD=SH_SELL; }
if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5; UD=SH_BUY; }
}
return(0);
}


Prelagatay, в данном коде, как только установлен индикатор на график, происходит выход за массив. В терминале, по идеи, в закладке "Эксперты", должна быть запись типа: array out of range, но не факт. В данной части кода не известно чему равна переменная NB, быть может она выведена в настройки. Пробуйте перед первым циклом: for (SH=1;SH<NB;SH++) прописать строку: if(CB==0) NB=Bars-11;

PS.
А что мешает предоставить весь файл, да бы не гадать, тут экстрасенсов нет.
 

Prelagatay

Местный житель
В этом индикаторе есть только эта функция которую я выложил, и функция "init()" в которой записаны два буфера которые рисуют стрелки на графике. Переменная NB проинициализирована без значения на глобальном уровне индикатора, и ей присваивается значение только в этой функции которую я выложил и в функции "init()".
extern int AllBars=0;//How many bars should be counted. 0 - all the bars.
extern int Otstup=30;//Step back.
extern double Per=9;//Period.
int SH,NB,i,UD;
double R,SHMax,SHMin;
double BufD[];
double BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации |
//+------------------------------------------------------------------+
int init()
{
//We will write the number of the bars for which we are counting to the NB
if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
IndicatorBuffers(2);
IndicatorShortName("SHI_SilverTrendSig");
SetIndexStyle(0,DRAW_ARROW,0,3);
SetIndexStyle(1,DRAW_ARROW,0,3);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
SetIndexBuffer(0,BufU);
SetIndexBuffer(1,BufD);
SetIndexDrawBegin(0,Bars-NB);//This indicator will be shown for NB bar only
SetIndexDrawBegin(1,Bars-NB);
ArrayInitialize(BufD,0.0);//Give a lot of "zero" to the buffe. Otherwise it will be garbage during the changing of time frame.
ArrayInitialize(BufU,0.0);
return(0);
}
 

mobidik

-----
В этом индикаторе есть только эта функция которую я выложил, и функция "init()" в которой записаны два буфера которые рисуют стрелки на графике. Переменная NB проинициализирована без значения на глобальном уровне индикатора, и ей присваивается значение только в этой функции которую я выложил и в функции "init()".
extern int AllBars=0;//How many bars should be counted. 0 - all the bars.
extern int Otstup=30;//Step back.
extern double Per=9;//Period.
int SH,NB,i,UD;
double R,SHMax,SHMin;
double BufD[];
double BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации |
//+------------------------------------------------------------------+
int init()
{
//We will write the number of the bars for which we are counting to the NB
if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
IndicatorBuffers(2);
IndicatorShortName("SHI_SilverTrendSig");
SetIndexStyle(0,DRAW_ARROW,0,3);
SetIndexStyle(1,DRAW_ARROW,0,3);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
SetIndexBuffer(0,BufU);
SetIndexBuffer(1,BufD);
SetIndexDrawBegin(0,Bars-NB);//This indicator will be shown for NB bar only
SetIndexDrawBegin(1,Bars-NB);
ArrayInitialize(BufD,0.0);//Give a lot of "zero" to the buffe. Otherwise it will be garbage during the changing of time frame.
ArrayInitialize(BufU,0.0);
return(0);
}

Вот скажи: тебе проще копировать куски кода и выкладывать под споллер или загрузить весь файл целиком? В приведенных тобой кусках кода не заданны переменные SH_BUY и SH_SELL.
Вообщем, сделай так, как я тебе написал и в циклах вместо знака "<" пропиши "<=" и будет тебе счастье.
 

Артмен

Новичок форума
Добрый день уважаемые программисты! Посвятите пожалуйста - советник закрывает и открывает ордера по обратному сигналу. И первый сигнал - "закрыть ордер", и тут же следующий сигнал - "открыть ордер". И сервер на следующий сигнал может не пустить.
А мне надо что бы была между этими сигналами была задержка хотя бы 50 мс. Подскажите как это сделать?
 

mobidik

-----
Добрый день уважаемые программисты! Посвятите пожалуйста - советник закрывает и открывает ордера по обратному сигналу. И первый сигнал - "закрыть ордер", и тут же следующий сигнал - "открыть ордер". И сервер на следующий сигнал может не пустить.
А мне надо что бы была между этими сигналами была задержка хотя бы 50 мс. Подскажите как это сделать?

После того, как отработает ф-ция закрытия ордеров, прописать Sleep(50);
 
Верх