Oll , спасибо за помощь!!! Но тестировать все равно не возможно, даже, за прошлую неделю - тормозит ужасно! Только, вот, почему-то, другие советники хорошо тестируются, при любых условиях... ~x(
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Убрал все лишние переменные типа "string" из индикаторов, ошибка пропала
Вот только ордера не открываются все равно
ЦитатаВы определили 2 буфера:
//---- 2 индикаторных буффера использованы для счёта
SetIndexBuffer(0, buf_1); // 0
SetIndexBuffer(1, buf_2); // 1
Вы их и читаете на 1-баре
Вот это не совсем понял...
Вы спросили: "А я хоть правильно проверяю буфер индикатора? Больше нуля он должен быть, как я понимаю..." - я ответил: правильно - 2 буфера №0 и №1.Вот это не совсем понял...
Точно, Ttomas !!!! цикл был не правильный!!!! ё-маё)))) Спасибо, друг!!!!!! :)
Вам нужно описать РСИ: rsi = iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,1); и в условие на вход дописать:
Действительно в уроке Сергей (xbms) в конце упомянул что необходимо в условия добавить ещё индикатор , например RSI. Чтоб убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности индикатора RSI. Вот строка кода с условиями как добавить RSI в неё ??? if (Bid >= PriceHight && CountSell() == 0) Где указать что будут использоваться оба индикатора???
if (Bid >= PriceHight && rci && CountSell() == 0) ...
Вместо 70 можно писать RSI_Up и вывести его во внешние настройки (вместе с RSI_Down)
Добрый день и спасибо огромное Вам 0ll . По аналогии могу вписать в код советника и "СТОХАСТИК" ???
так же объявив внешние
extern int stohastic_period=14;
extern int stohastic_Up=80;
extern int stohastic_Down=20;
нужен ли ? double StochasticBuffer[];
объявляется стохастик так ??? stohastic=iStochastic(NULL,0,stohastic_period,3,3,MODE_SMA,0,MODE_MAIN,shift);
и в условия вставить так ??? if (Bid >= PriceHight && stohastic && CountSell() == 0)
Зачем Вам StochasticBuffer[]? - где Вы это нашли?
нужен ли ? double StochasticBuffer[];
объявляется стохастик так ??? stohastic=iStochastic(NULL,0,stohastic_period,3,3,MODE_SMA,0,MODE_MAIN,shift);
и в условия вставить так ??? if (Bid >= PriceHight && stohastic && CountSell() == 0)
про объявление стохастика лучше смотрите справку.
условия примерно правильно - я-ж не знаю как Вы хотите стоха использовать...
Знающие помогите, как сделать так чтобы этот бот открывал только один ордер на 1 сигнал.
Шас он так работает....допустим сигнал на сел....он открывает ордер на сел при достижении ТП или СЛ он опять открывает на сел....как сделать чтоб он ждал сигнал на бай...а не лепил дальше сеЛ!?
Думаю понятно объяснил)))
условия примерно правильно - я-ж не знаю как Вы хотите стоха использовать...
Спасибо огромное Вам 0ll за ответ, это в продолжение разговора о советнике которого в уроке №3 Сергей (xbms) преподавал. Работа в канале ТМА, и в подтверждении входа дополнительно убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности стохастик . Но не базовый, а планирую реализовать с ОБЯЗАТЕЛЬНЫМ УСЛОВИЕМ, пересечениями зелёной и красной между собой, линий стохастика.Если подскажите как реализовать в коде буду признателен. Для наглядности пересечения отметил на приложенном фото.
Добавлено: 03-04-2015 09:30:19
условия примерно правильно - я-ж не знаю как Вы хотите стоха использовать...
Спасибо огромное Вам 0ll за ответ, это в продолжение разговора о советнике которого в уроке №3 Сергей (xbms) преподавал. Работа в канале ТМА, и в подтверждении входа дополнительно убедиться что цена двинулась от границ канала TMA и одновременно из зон перекупленности или перепроданности стохастик . Но не базовый, а планирую реализовать с ОБЯЗАТЕЛЬНЫМ УСЛОВИЕМ, пересечениями зелёной и красной между собой, линий стохастика.Если подскажите как реализовать в коде буду признателен. Для наглядности пересечения отметил на приложенном фото.
При компиляции под новым билдом, кода советника из №3 урока, выходят ошибки
'Sumbol' - function not defined
implicit conversion from 'number' to 'string'
'i' - undeclared identifier
'Sumbol' - function not defined
implicit conversion from 'number' to 'string'
'Sumbol' - function not defined
implicit conversion from 'number' to 'string'
4 error(s), 3 warning(s)
Код советника прилагаю, что я упустил?
Изменено 3 апреля, 2015 пользователем Гриня
Помогите пожалуйста разобраться - как работает OrderSend ?
if(OrdersTotal()==0)
{
if(!Vkl_TP_SL)
{
if(Fast_MA_2Slow_MA_1)
{
if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,30,0,0,NULL,Magic,0,clrBlue))
Print("Ошибка окрытия BUY: ",GetLastError());
}
if(Fast_MA_2>Slow_MA_2&&Fast_MA_1 {
if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,30,0,0,NULL,Magic,0,clrRed))
Print("Ошибка окрытия SELL: ",GetLastError());
}
}
Не пойму применения "отрицания ! ".
Во первых int OrderSend(), и еще " логическое отрицание (!) применимо только к булевым переменным".
Запутался. в упор не понимаю. Везде " Ошибка открытия... "
Но этот код работает - проверял на тестере.
ЦитатаНеобходимо отметить, что в логических выражениях допустимо использовать вместо типа bool другие целые или вещественные типы или выражения этих типов, компилятор не выдаст ошибки. В таком случае значение ноль будет интерпретировано как false, а все остальные значения как true
это значит, что когда ордер успешно размещён МТ возвращает № тикета > 0 - это true, НО в случае ошибки (в реальной работе, а не в тестере) будет возвращен -1, т.е. тоже true, ибо только 0 - false. В приведённом примере обработки ошибки по сути нет - вывод сообщения не считается, по этому всё работает, при серьёзном подходе к обработке ошибок открытия так делать нельзя!
Молодец, сам разобрался! Достаточно одной переменной на все функции, возвращающие true/false.
Вопрос: достаточно ли такого указания переменной? Для Ask варианта также modify1 определять или уже нужно modify2?Тоже касается и переменных OrderSelect, OrderDelete, OrderClose, OrderSend ...
Низкий поклон Вам 0ll за доброту.И за пояснения. В коде осталось если ещё ошибки return value of 'OrderModify' should be checked , прописывая bool modify1= Выходит ошибка что уже объявлена 'modify1' - variable already defined ,если ничего не прописать то ошибки не исчезнут при компиляции
Не понял... это вопрос? если всё-таки вопрос, то modify1 можно объявлять один раз, а потом пользоваться без объявления (если объявлена глобально).
В коде осталось если ещё ошибки return value of 'OrderModify' should be checked , прописывая bool modify1= Выходит ошибка что уже объявлена 'modify1' - variable already defined ,если ничего не прописать то ошибки не исчезнут при компиляции
Не понял... это вопрос? если всё-таки вопрос, то modify1 можно объявлять один раз, а потом пользоваться без объявления (если объявлена глобально).
В коде осталось если ещё ошибки return value of 'OrderModify' should be checked , прописывая bool modify1= Выходит ошибка что уже объявлена 'modify1' - variable already defined ,если ничего не прописать то ошибки не исчезнут при компиляции
Похоже не правильно объявил потому что остались предупреждения после компиляции. И ошибки 'HighesBuffer' - invalid array access
'LowesBuffer' - invalid array access
что исправить? если есть приведите пример кода
для наглядности ,пожалуйста.
По поводу замечаний о проверке возвращаемого значения ф-циями ОрдерМодифи и ОрдерКлоуз - в чём проблема? Вы же объявили переменную modifi1, ну и присваивайте ей значения, возвращаемые этими функциями.
Гриня Массивы объявлены как динамические (безразмерные) которые перед употреблением нужно инициализировать и определить размерность (видимо это не сделано).
По поводу замечаний о проверке возвращаемого значения ф-циями ОрдерМодифи и ОрдерКлоуз - в чём проблема? Вы же объявили переменную modifi1, ну и присваивайте ей значения, возвращаемые этими функциями.
Здравствуйте 0ll . Спасибо за пояснения! Достаточно ли, после объявления глобальной, такого решения ??? modify1=OrderModify(ticket2, OrderOpenPrice(), SL, TP, 0);
Я чтоб не путаться в следующий раз попрошу уточнения какие варианты наиболее грамотное решение?
Существуют решения следующие:
bool select1=OrderSelect..........
bool delete1=OrderDelete..........
bool close1=OrderClose..........
bool modify1=OrderModify..........
int send1=OrderSend..........
bool OrdSellMod = OrderModify(ticket,OrderOpenPrice(),SLSell,0,0);
bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0);
bool sel=OrderSelect(tic,SELECT_BY_TICKET);
также Вы советуете bool res = OrderModify())
Добавлено: 06-04-2015 08:39:43
Домашнее задание по уроку №3 работа в канале по индикатору ТМА. Присоединяюсь к сообщениям от ar7319 и Deymos что советник пропускает входы в сделку при наличии условий !!! Недочёты :
1)Почему-то открывает только одну сделку. При закрытии ордера по TP, SL, или у противоположной границы -- далее тишина. Не входит в противоположную сторону при наличии условий Например у верхней границы сов поставил SELL. Но цена ушла вверх и сработал SL. Все, ордеров нет, цена выше PriceHigh канала, т.е. условия для открытия нового SELL. За сутки всего 8 сделок на 5-ти мин. остальные пропустил как "СЛЕПОЙ"
Фото прилагаю.
Способы лечения: частота проверок условий входа в сделку, слишком простой код условий, блок кода для отслеживания приближения цены к верхней или нижней границе канала. Возможно нужно во внешние переменные вывести и указать параметр в процентах. Приближение к границам канала.
Что ВЫ бы применили на практике ??? Чтоб он начал торговать по хорошему.
Изменено 6 апреля, 2015 пользователем Гриня
if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES)) continue;
По поводу пропуска сделок. Я ранее писал, что xbms оставил в коде простенькие ошибки - для самостоятельного поиска. Так же неоднократно писал о перерисовке ТМА на глубину 2*Полупериода. Ставьте на тот-же график индикатор КС с тем-же периодом (он не рисует) и смотрите на истории где был канал ТМА (примерно) если-бы не перерисовался и была-ли там сделка.
Как написать функцию которая считает количество баров с момент открытия ордера. ордер единственные.
Например:
поступил сигнал
открыли ордер
через N баров ордер закрыли. (N - внешняя переменная)
как написать функцию возвращающую количество баров с момента открытия ордера. (не дней, если на Д1 графике) а именно баров истории (т.к. есть выходные и неторговые дни)
int barcount = iBarShift(NULL,мой_PERIOD,OrderOpenTime());
Попробую, но тогда нужно какую-то функцию, которая будет определять OrderOpenTime() для открытого ордера (он будет единственный открытый для данного Magic) и возвращать значение OrderOpenTime() для подстановки в данную функцию, приведённую вами. как ее лучше написать ?
Изменено 7 апреля, 2015 пользователем fintech
Тут вариантов ещё больше.
Можно при открытии ордера запоминать дату/время
или выбрать ордер по магику и тогда ОрдерОпенТайм будет работать.
Здравствуйте! Подскажите пожалуйста как сделать ограничение на количество открываемых ордеров (например, в серии не более 10 шт.)??? (это из урока №4)
Не знаю как в уроке сказано, а так, в настройках указать параметр:
extern int MaxOrders = 10;
затем:
if (Ваше условие на открытие ордера)
{
if (MaxOrders>OrdersTotal())
{
ваше действие
}
}
mobidik , спасибо! :)))
:)
Так же неоднократно писал о перерисовке ТМА на глубину 2*Полупериода. Ставьте на тот-же график индикатор КС с тем-же периодом (он не рисует) и смотрите на истории где был канал ТМА (примерно) если-бы не перерисовался и была-ли там сделка.
Доброго вечера 0ll , пусть ТМА рисует не корректно,но как объяснить сделки по ценам которые там не гуляли !!! Если судить по тестированию нашего советника из урока №3.
20 мая 2013 две сделки, а на графике цена на много выше,мы не могли войти там в сделку. фото приложил)))
Второй момент сделка №1 и №2 закрылась по цене 1,29417 и 1,29864, а хай этого дня вообще не поднимался выше 1,29006. Фото приложил , архив котировок брокера Фибо групп. Понимаю что это всего лишь видеоролик где xbms учит нас программированию,но цены несуществующие :-?
Добавлено: 07-04-2015 17:11:55
Не нарушается ли логика в последовательности действий ???
Если в коде указанны блок продаж Sell , потом блок покупок Buy . Потом блоки закрытия. В фото приведённом постом выше, мы одновременно находились в сделке и Buy и Sell по Евро Доллару.
Изменено 7 апреля, 2015 пользователем Гриня
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем