borilunad: Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.
Конечно, помню. Покапаю. На самом деле, мне нужно менять привычки. Уже не первый программист говорит, что мой код понять не просто. Видимо так и есть...
borilunad: Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.
Переменными можно обойтись только, если проверяем стратегию в тестере.
Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.
С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).
Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)
Буду весьма признателен за подсказку что где не так.
Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):
// Предварит.обработкаif(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start
vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0); //значение индикатора на покупку
vniz = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0); //значение индикатора на продажуif(vverh==0 && vniz==0)
{
Alert("Сигнала нет. Эксперт ждёт сигнал.");
return;
}
if(Bars < Glubina) // Недостаточно баров
{
Alert("Недостаточно баров в окне. Эксперт не работает.");
return; // Выход из start()
}
if(Work==false) // Критическая ошибка
{
Alert("Критическая ошибка. Эксперт не работает.");
return; // Выход из start()
}
//--------------------------------------------------------------- 4 --// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
Total=0; // Количество ордеровfor(i=1; i<=OrdersTotal(); i++) // Цикл перебора ордеров
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:if (OrderSymbol()!=Symb)continue; // Не наш фин. инструмif (OrderMagicNumber()!=MagicNumber) // Попался ордер открытый не советникомcontinue;
Total++; // Счётчик ордеров открытых советникомif (Total>1) // Не более одного орд
{
Alert("Несколько ордеров одного советника. Эксперт не работает.");
return; // Выход из start()
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Price =OrderOpenPrice(); // Цена выбранн. орд.
SL =OrderStopLoss(); // SL выбранного орд.
TP =OrderTakeProfit(); // TP выбранного орд.
Lot =OrderLots(); // Количество лотов
}
}
//--------------------------------------------------------------- 5 --// торговые критерииif(vverh>0)
{
Opn_B=true;
Cls_S=true;
Opn_S=false;
Cls_B=false;
}
if(vverh>0)
{
Opn_S=true;
Cls_B=true;
Opn_B=false;
Cls_S=false;
}
//--------------------------------------------------------------- 6 --//расчет стопов
i_stop=0;
while (stopov_for_S<2) //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
{
for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
if (for_S>0)
{
stopov_for_S++;
if(Stop_for_S<for_S) Stop_for_S=for_S;
}
i_stop++;
}
i_stop=0;
while (stopov_for_B<2)
{
for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
if (for_B>0)
{
stopov_for_B++;
if(Stop_for_B<for_B) Stop_for_B=for_B;
}
i_stop++;
}
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;
// Закрытие и модификация ордеровwhile(true) // Цикл закрытия и модификации орд.
{
if (Tip==0 && Opn_B==true) // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
{
OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера байbreak;
}
if (Tip==0 && Opn_S==true) // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Bid,50); // закрываем БАЙif (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Buy ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
if (Tip==1 && Opn_S==true)
{
OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
break;
}
if (Tip==1 && Opn_B==true)
{
RefreshRates();
Ans=OrderClose(Ticket,Lot,Ask,50);
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер Sell ",Ticket);
break; // Выход из цикла закр
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попытка
}
}
//--------------------------------------------------------------- 7 --// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размераif (Lots > 0) // Если заданы лоты,то
Lts =Lots; // с ними и работаем else// % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытияif(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальнif (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --// Открытие ордеровwhile(true) // Цикл закрытия орд.
{
Ticket=0;
if (Opn_B==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buyif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
if (Opn_S==true) // Открытых орд. нет +
{ // критерий откр. Buy
RefreshRates(); // Обновление данныхAlert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sellif (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибокcontinue; // Повторная попыткаreturn; // Выход из start()
}
}
//--------------------------------------------------------------- 9 --return; // Выход из start()
}
If (торговые условия сигнал №1)
{
}// Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору «торговых условий №2»
If (торговые условия сигнал №2)
{
}// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых условий №3 и №4»
If (торговые условия сигнал №3)
{
Opn_B=true;
}
else
If (торговые условия сигнал №4)
{
Opn_S=true;
}
elsereturn(0);
Суть проблеммы следующая: не понятно, что вписать в фигурные скобки тела операторов №1,2 по сути там проверяется соответствие торговых условий и больше никаких действий не происходит.
(Есть четыре торговых сигнала, срабатывает №1, передаем управление в обработку сигнала №2, срабатывает №2 передаем в обработку сигналов №3 и 4 и там уже производим торговые операции.)
elsereturn(0);
Стоит ли в конце вписать? По логике вещей, если сигналы № 3,4 не срабатывают, то мне необходимо, чтобы советник начал снова.
Переменными можно обойтись только, если проверяем стратегию в тестере.
Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.
А разве теряются переменные, записанные в экстерне? Этого ни разу не случалось! Зато все условия перед глазами и под руками в старте(), а функциям, которые за пределами старта(), поручаю проверки и конечные неменящиеся действия! Очень может быть, что по большому счёту я и неправ, но пока мне удобно так, и на Реале ещё не получил ни одной ошибки, ни рэквота! Я всегда внимательно прочитываю, именно ваши посты, Артём, и других опытных программистов, как alsu, Meat и других, как и ув. модераторов! Но не всё ещё в моих возможностях, поэтому не могу применять то, что мне ещё неясно до малейших деталей. Спасибо за всё!
С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).
Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)
Буду весьма признателен за подсказку что где не так.
Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):
Если Вы заменили названия индикаторов только в советнике, а не также в самих кодах индикаторов, которых вывели в соответствующие окна на графиках, тогда советник не получит от них ничего, а ошибку не даёт, т.к. в советнике всё представлено, но сигналов от индикаторов не получает. Проверьте, так же ли прописаны названия индикаторов в них самих!
borilunad: Если Вы заменили названия индикаторов только в советнике, а не также в самих кодах индикаторов, которых вывели в соответствующие окна на графиках, тогда советник не получит от них ничего, а ошибку не даёт, т.к. в советнике всё представлено, но сигналов от индикаторов не получает. Проверьте, так же ли прописаны названия индикаторов в них самих!
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Может кто то еще с такой проблемой сталкивался.
Проверьте, как назван индикатор не в папке, а в коде его: "short name", т.к. по нему советник его признаёт, если ещё установлен на соответствующем графике и ТФ!
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.
Конечно, помню. Покапаю. На самом деле, мне нужно менять привычки. Уже не первый программист говорит, что мой код понять не просто. Видимо так и есть...
Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.
Переменными можно обойтись только, если проверяем стратегию в тестере.
Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.
Всем доброго времени суток.
С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).
Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)
Буду весьма признателен за подсказку что где не так.
Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):
Суть проблеммы следующая: не понятно, что вписать в фигурные скобки тела операторов №1,2 по сути там проверяется соответствие торговых условий и больше никаких действий не происходит.
(Есть четыре торговых сигнала, срабатывает №1, передаем управление в обработку сигнала №2, срабатывает №2 передаем в обработку сигналов №3 и 4 и там уже производим торговые операции.)
Стоит ли в конце вписать? По логике вещей, если сигналы № 3,4 не срабатывают, то мне необходимо, чтобы советник начал снова.
Переменными можно обойтись только, если проверяем стратегию в тестере.
Для реала каждое необходимое значение для выполнения логики нужно рассчитывать в нужный момент времени, ведь значения этих переменных очень легко потерять, например при перезапуске.
Всем доброго времени суток.
С написанием индюков уже разобрался, а вот с первым роботом возникли проблемы. Вроде как все логично, компилятор не ругается, в журнале ошибок нет, но советник на тестере не работает - график открывает, но движений на этом графике никаких не происходит (не двигается именно график).
Замысел в следующем: Индикатор выдает точки(всегда на открытие свечи и по цене открытия свечи) от которых нужно купить или продать, задача робота при этом, получив такую точку на покупку или продажу, закрыть противоположный ордер, открыть новый или модифицировать старый ордер в том же направлении (стопы и ТП выдаются по другому индикатору)
Буду весьма признателен за подсказку что где не так.
Сам код (названия индюков изменил в соответствии с их функционалом, убрал раздел объявления переменных и обработки ошибок):
Если Вы заменили названия индикаторов только в советнике, а не также в самих кодах индикаторов, которых вывели в соответствующие окна на графиках, тогда советник не получит от них ничего, а ошибку не даёт, т.к. в советнике всё представлено, но сигналов от индикаторов не получает. Проверьте, так же ли прописаны названия индикаторов в них самих!
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Может кто то еще с такой проблемой сталкивался?
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Может кто то еще с такой проблемой сталкивался.
Спасибо за совет, еще раз все перепроверил, ошибок в написании нет. Названия индикаторов я заменил только в тексте первого сообщения на форуме, для того чтоб было понятна их задача ,в текстах советника названия индюков написано ровно так как они названы в папке "indicators". Например: "3.0_figuri_2.3_rasshirenie".
Кроме того, для контроля выбрал другой советник (из учебника) и ввел в функцию iCustom названия несуществующих индикаторов. Произхошло следующее - торговать советник действительно перестал (что в прочем понятно), но при запуске тестера график двигался от заданных начальной до конечной даты, у меня, напомню проблема именно в том что график не двигается.
Может кто то еще с такой проблемой сталкивался?