Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Советник, основной обработчик тиков (фрагмент кода).
//----- Блок для проверки обмена с индикатором //1. Цикл проверки заданий и постановки на выполнение. Перебираем все команды от 1 до N. Для каждой: // //1.0. Если канал занят BuseInd_N=1, - не используем ибо используется в индикаторе, чтобы не выдавать новую команду до окончания обработки предыдущей. // 1.1. Если обнаружена команда N: Command_N=N, то выполняем: // 1.1.1. Если снят флаг завершения Ready_N=0, то выполняем: // 1.1.1.1. Сбрасываем команду Command_N=0 // 1.1.1.2. Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0; (изначально все эти флаги сброшены, но на всякий) // 1.1.1.3. Запускаем команду на выполнение (после выполнения команды должен быть установлен внутренний флаг выполнения команды N: ReadyExp_N=1; // //В результате должно быть: Ready_N=0 (сброшено индикатором), Command_N=0 (сброшено советниом), ReadyExp_N=0??? (сброшено советником) // //Ситуация Ready_N=0 + Command_N=0, говорит о том, что команда запущена на выполнение, но ещё не выполнена. datetime TimeSet=0; ulong CommandGet=0; ulong ReadyGet=0; {for(int i=1;i<=2;i++)//Перебор типов Команд { {for(int j=0;j<=1;j++)//Перебор типов Позиций { {if(GlobalGetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),CommandGet) &&(CommandGet==CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))) //Если обнаружена команда N: Command_N=N { {if(GlobalGetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandGet),ReadyGet)&&(ReadyGet==0)) //Если снят флаг завершения Ready_N=0 { {if(GlobalSetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,0))//Сбрасываем команду Command_N=0 { ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=0; //Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0 RunCommand[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=true; //Имитация запуска команды if(PrintDebug)Print("Сов запущена команда "+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))+" "); }}//if(GlobalSetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,0) }}//if(GlobalGetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandGet),ReadyGet)&&(ReadyGet==0)) }}//if(GlobalGetUlong("LIP_"+TheSymbol+"_Command_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),CommandGet) }}//for(int j=0;i<=1;i++) }}//for(int i=1;i<=2;i++) //2. Цикл проверки выполнения. Перебираем все команды от 1 до N. Для каждой: // 2.1. Если установлен внутренний флаг завершения команды N: ReadyExp_N=1, то выполняем: // 2.1.1. Устанавливается флаг завершения Ready_N=1 для переменной Ready_N (команда N выполнена) // 2.1.2. Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0; // //В результате должно быть: Ready_N=1 (установлено советником), Command_N=0 (сброшено советниом), ReadyExp_N=0 (сброшено советником) {for(int i=1;i<=2;i++)//Перебор типов Команд { {for(int j=0;j<=1;j++)//Перебор типов Позиций { {if(ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]==1) //Если установлен внутренний флаг завершения команды N: ReadyExp_N=1 { {if(GlobalSetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,1))//Устанавливается флаг завершения Ready_N=1 { ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]=0; //Сбрасываем для советника внутренний флаг завершения команды N: ReadyExp_N=0 if(PrintDebug)Print("Сов завершена команда "+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j))+" "); }}//if(GlobalSetUlong("LIP_"+TheSymbol+"_Ready_"+IntegerToString(CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)),TimeSet,1) }}//if(ReadyExp[(int)CommandCode((enCommandType)i,(ENUM_POSITION_TYPE)j)]==1) }}//for(int j=0;i<=1;i++) }}//for(int i=1;i<=2;i++) //----- Цикл имитации выполнения. {for(int i=1;i<=4;i++)//Перебор Команд { {if(RunCommand[i]) { if(PrintInfo)Print("Сов выполнена команда>>"+IntegerToString(i)+" gnTick="+IntegerToString(gnTick)); ReadyExp[i]=1; //Устанавливаем для советника внутренний флаг завершения команды N: ReadyExp_N=1 RunCommand[i]=false; }}//if(RunCommand[i]) }}//for(int i=1;i<=4;i++)Состояние проекта на текущий момент.
Работа по проекту будет продолжена.
Планируется некоторое изменение структуры комплекса, в частности механизмов запуска-прекращения работы и механизмов обмена данными внутри комплекса.
Долгое отсутствие связано с тем, что отвлекался на тесно связанную с текущим проектом тему о возможности и корректности параллельной работы индикаторов:
Где живёт индикатор созданный в режиме тестирования без визуализации?
https://www.mql5.com/ru/forum/217719
демо пример для параллельной работы во вложении.
По данной теме создан общедоступный проект LIP.
Текущая версия индикатора v1.006.
Проводится локализация на английский.
Вид экрана:
Окно настроек:
Конструктивная критика приветствуется.