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

Milord

Местный знаток
Вот про это я и говорю. Условие if(MA1>MA2) это буквально тело импульса то есть 1. Передний фронт это: переход от 0 к 1. То есть момент пересечения МА.
По простому это будет:
OnTick()
{
static double LastMA1, LastMA2;
double MA1, MA2;
MA1=iMA(...);
MA2=iMA(...);
//Инициализация прошлого значения
if(LastMA1<0.0000001 || LastMA2<0.0000001)
{
LastMA1=MA1;
LastMA2=MA2;
}
//Если был 0, а стала 1 и количество ордеров не достигло максимального.
if(LastMA1<=LastMA2 && MA1>MA2 && OrdersTotal() < MaxOrders)
{
OrderSend(...);
}
LastMA1=MA1;
LastMA2=MA2;
}}
при каждом новом переднем фронте будет открываться ордер. это будет нормально работать в тестере. Для надёжной работы в реальных условиях, нужно добавить ооооочень много "лишнего" кода.

спасибо за ответ! правда не верится что нельзя проще и короче...вапще удивляет, когда программисты с опытом пишут простую логику очень сложно, а кто имеет мало опыта, проще намного...хотя помню как в школе по математике была контрольная, с простыми заданиями, так вот все отличники думали и решали сложно, поэтому еле сдали на 3ки, те же кто учился на 3ки - написали на 4 и 5, просто отличники не смогли переключить мышление на простое...
а как на счет такого кода, случайно нашел по кодам...будет он работать как надо?

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < 1)
  {
//---------------------

   if(MA1>MA2)
    {
     OrderSend(....);
    }

//---------------------
  }
return(0);
}
 
Последнее редактирование:

ksardas

Гуру форума
мое имхо
тригер=2
при выполнеии условия если if(.....и ( тригер!=1)
выполнили тригер=1
второеусловие если .....if(тригер=0( тригер!=0)
выполнили тригер=0
и все)))
 

Milord

Местный знаток
мое имхо
тригер=2
при выполнеии условия если if(.....и ( тригер!=1)
выполнили тригер=1
второеусловие если .....if(тригер=0( тригер!=0)
выполнили тригер=0
и все)))
спасибо за ответ!
поскольку даже 1 знак неверно написанный в коде меняет логику выполнения программы,не могли бы вы показать на моем примере ваш вариант???

PHP:
extern int MaxOrders=5;

int start()
{
 if(OrdersTotal() < MaxOrders)
  {
//---------------------

   if(MA1>MA2)
    {
     OrderSend(....);
    }

//---------------------
  }
return(0);
}
 

Alexz2107

Интересующийся
Как найти проблему?!

Все здравствуйте! Написал советника, а он, собака, виснет. Виснет, я так полагаю, одна функция. Суть в том, что у него несколько режимов работы. В штатном режиме все функционирует прекрасно, когда ситуация становится критической, активируется режим спасения. Переключение тоже проходит безупречно. А вот этот самый режим спасения начинает работать, открывает несколько ордеров и быстро зависает. То есть терминал вроде работает, котировки поступают, но советник ордера не открывает. Пытаюсь снять его с графика, терминал зависает наглухо, закрываю его только Завершением задачи. При перезагрузке запускаю спасение вручную, или оно активируется автоматом - происходит то же самое, несколько ордеров и заклинивает. Подскажите, пожалуйста, как, собственно, искать ошибку? Или лучше с маху переписать всю эту функцию?
:facepalm:
 

Ugar

Гуру форума
Все здравствуйте! Написал советника, а он, собака, виснет. Виснет, я так полагаю, одна функция. Суть в том, что у него несколько режимов работы. В штатном режиме все функционирует прекрасно, когда ситуация становится критической, активируется режим спасения. Переключение тоже проходит безупречно. А вот этот самый режим спасения начинает работать, открывает несколько ордеров и быстро зависает. То есть терминал вроде работает, котировки поступают, но советник ордера не открывает. Пытаюсь снять его с графика, терминал зависает наглухо, закрываю его только Завершением задачи. При перезагрузке запускаю спасение вручную, или оно активируется автоматом - происходит то же самое, несколько ордеров и заклинивает. Подскажите, пожалуйста, как, собственно, искать ошибку? Или лучше с маху переписать всю эту функцию?
:facepalm:
обычно зависания связаны с зацикливанием или сном. Если он выполняет Sleep(60000); то минуту советник не открывает свойства, не удаляется и вообще ничего не делает. Нужно дождаться когда проснётся.
 

Alexz2107

Интересующийся
обычно зависания связаны с зацикливанием или сном. Если он выполняет Sleep(60000); то минуту советник не открывает свойства, не удаляется и вообще ничего не делает. Нужно дождаться когда проснётся.
Вообще функция зациклена, но зависания происходят, когда условия цикла все еще актуальны. Я сейчас повтыкал на каждом шагу алерты, чтобы видеть, на каком шаге зависает функция. выяснил, что две внешние функции, которые высчитывают значения для этой самой проблемной функции выполняются по много раз в секунду. Периодически процессор грузится на 95-97%. В эти моменты происходит зависание. Если я правильно понял, это как раз от этих высчетов каждую секунду? Правильно ли тогда поставить после каждого открытия ордера Sleep примерно на секунду?
 
Последнее редактирование:

Alexz2107

Интересующийся
обычно зависания связаны с зацикливанием или сном. Если он выполняет Sleep(60000); то минуту советник не открывает свойства, не удаляется и вообще ничего не делает. Нужно дождаться когда проснётся.
Вы правы, зависание происходило, судя по всему из-за зацикливания. Поставил Sleep(1000), высчеты шли раз в секунду, но зависало все равно. Поставил выход из цикла, стало работать корректно. Но теперь ордера открываются только по поступлении тика, выходит очень медленно. А желательно бы организовать выполнение цикла, не дожидаясь новых тиков. Можно ли так выполнить цикл? Там принцип такой:
ФУНКЦИЯ()
а=ФУНКЦИЯ1();
б=ФУНКЦИЯ2();
цикл(а>б)
ФУНКЦИЯ3(в,г)
Хотелось бы, чтобы ФУНКЦИЯ как раз была зациклена и выполнялась, пока условия не станут ложными.
 

Ugar

Гуру форума
Вы правы, зависание происходило, судя по всему из-за зацикливания. Поставил Sleep(1000), высчеты шли раз в секунду, но зависало все равно. Поставил выход из цикла, стало работать корректно. Но теперь ордера открываются только по поступлении тика, выходит очень медленно. А желательно бы организовать выполнение цикла, не дожидаясь новых тиков. Можно ли так выполнить цикл? Там принцип такой:
ФУНКЦИЯ()
а=ФУНКЦИЯ1();
б=ФУНКЦИЯ2();
цикл(а>б)
ФУНКЦИЯ3(в,г)
Хотелось бы, чтобы ФУНКЦИЯ как раз была зациклена и выполнялась, пока условия не станут ложными.
2 варианта:
1. Этот будет работать в тестере, но может не помочь. Засунуть в цикл сон на 0.1 секунду.
Во время сна, советник не работает, но и не грузит процессор.
цикл(а>б)
{
действия в цикле
Sleep(100);
}
2. задействовать системный таймер вместо цикла. Инициализировать его на 0.1 секунды. Этот вариант почти не грузит процессор, но в тестере не будет работать, так как он не умеет моделировать таймер.

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

AlexeyVik

Программист mql4 mql5
Ну или продумать алгоритм так что бы избежать зависания. Может продумать заново и переписать функцию с циклом.
Как вариант для нормального снятия советника с чарта можно использовать IsStopped в цикле.
Код:
if(IsStopped()) break; // из цикла
 

Alexz2107

Интересующийся
2 варианта:
1. Этот будет работать в тестере, но может не помочь. Засунуть в цикл сон на 0.1 секунду.
Во время сна, советник не работает, но и не грузит процессор.
цикл(а>б)
{
действия в цикле
Sleep(100);
}
2. задействовать системный таймер вместо цикла. Инициализировать его на 0.1 секунды. Этот вариант почти не грузит процессор, но в тестере не будет работать, так как он не умеет моделировать таймер.

Ну или продумать алгоритм так что бы избежать зависания. Может продумать заново и переписать функцию с циклом.
Первый вариант вешается. А по поводу второго подробнее можно? Я еще с ним не сталкивался.
 

Alexz2107

Интересующийся
Как вариант для нормального снятия советника с чарта можно использовать IsStopped в цикле.
Код:
if(IsStopped()) break; // из цикла
Да дело-то не в снятии. Я вчера доработал функцию, вроде бы все работает идеально, и не виснет, и процессор не грузит, и снимается легко и непринужденно. Чисто технически к советнику сейчас претензий нет. Хотелось бы именно ускорить работу цикла. Функция IsStopped() работает только для снятия с чарта или можно использовать в любой функции?
 

AlexeyVik

Программист mql4 mql5
Да дело-то не в снятии. Я вчера доработал функцию, вроде бы все работает идеально, и не виснет, и процессор не грузит, и снимается легко и непринужденно. Чисто технически к советнику сейчас претензий нет. Хотелось бы именно ускорить работу цикла. Функция IsStopped() работает только для снятия с чарта или можно использовать в любой функции?
Я посоветовал как вариант снятия советника для дальнейшей правки кода без перезагрузки терминала. А по логике IsStoped() должна работать при любой остановке советника. Будь то отжатие кнопки или просто закрытие терминала. Тоесть прекращает выполнение и переходит в деинит.
 

Alexz2107

Интересующийся
Я посоветовал как вариант снятия советника для дальнейшей правки кода без перезагрузки терминала. А по логике IsStoped() должна работать при любой остановке советника. Будь то отжатие кнопки или просто закрытие терминала. Тоесть прекращает выполнение и переходит в деинит.
Жаль, тогда мне это и ни к чему. Я думал, это что-то сродни break.
 

Ugar

Гуру форума
Первый вариант вешается. А по поводу второго подробнее можно? Я еще с ним не сталкивался.
//Сначала инициализировать таймер
int OnInit()
{
//---
EventSetMillisecondTimer(100);
//---
return(INIT_SUCCEEDED);
}

//Дальше функция таймера выполняется как цикл, примерно 10 раз в секунду, так как при инициализации было задано 100ms.
void OnTimer()
{

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

Gnn-life

Местный знаток
*hi*Уважаемые прогеры...или начинающие, вобщем вопрос? как вставить в советник индикатор i-custom (весь код), дальше разберусь (наверно)...извините учусь....
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
*hi*Уважаемые прогеры...или начинающие, вобщем вопрос? как вставить в советник индикатор i-custom(весь код), дальше разберусь (наверно)...извините учусь....
А в документации разве не весь код? _http://docs.mql4.com/ru/indicators/icustom
 

Vik940

Почетный гражданин
Уважаемые знатоки подскажите пожалуйста существует ли фукция или код автоматической загрузки параметров советника из сет файла при оприделенных условиях. Если да то подскажите где можно почитать о ней или образец кода.Заранее большое спасибо кто ответит.
 

matro3

Почетный гражданин
По данному вопросу куча инфы в сети, наприме:
_http://www.mqlvopros.net/?qa=57/%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C-csv-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%B7-mql4
 

AlexeyVik

Программист mql4 mql5
Уважаемые знатоки подскажите пожалуйста существует ли фукция или код автоматической загрузки параметров советника из сет файла при оприделенных условиях. Если да то подскажите где можно почитать о ней или образец кода.Заранее большое спасибо кто ответит.
_http://docs.mql4.com/ru/chart_operations
 
Последнее редактирование модератором:

Yura Vakulenko

Активный участник
Помогите с кодом советника

Здравствуйте!:) Знающие.. можете помочь верно написать код.. как открывать , а потом и закрывать ордера.. вот по примеру( как на картинке.. Линиии рисовая я руками..)

Стрелки там не перерисовываются! Появляются на 1-м баре (т.е мне нужно чтобы советник открывал ордера не на тиках.. а по закрытию сигнального бара.. т.е. сразу по цене открытия текущего бара, как только на предыдущем нарисовались стрелки.. ) (есть и возможность появления на 0 баре, но это пока не нужно.. ). Их рисует индикатор..

в иникаторе исп 3 буфера.

0 - Основной (Расчетный)
1 - Зона перекупленности
2 - Зона перепроданности

Условие появления стрелки вверх.. (открытие длинной позиции и закрытие всех коротких, если такие имеются... .. по цене открытия текущего бара)
Если (Буфер 0 на 1-м баре > -100 и Буфер 2 на 1-м баре Пуст и Буфер 2 на 2-м баре < -100 )

Условие появления стрелки вниз.. (открытие короткой позиции и закрытие всех длинных, если такие имеются.. по цене открытия текущего бара)
Если (Буфер 0 на 1-м баре < 100 и Буфер 1 на 1-м баре Пуст и Буфер 1 на 2-м баре > 100 )

И расчет лота для серии ордеров (как на покупку, так и на продажу...)
старт лот 0.01
1-ордер серии - лот 0.01
2-ордер серии - лот 0.02
3-ордер серии - лот 0.03
4-ордер серии - лот 0.06
5-ордер серии - лот 0.12
6-ордер серии - лот 0.24
7-ордер серии - лот 0.48
Как только закрылась серия ордеров - расчет лота для новой позиции повторяется по приведенной выше схеме..

Подскажите, как жто мне в коде написать.. или дайте ссылку на источник с примерами как это делается верно!) Спасибо!!:please::)
 

Вложения

  • GBPUSDproH1.png
    GBPUSDproH1.png
    37,2 КБ · Просмотры: 24
Верх