Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#2676


Oll, но в твоем примере не сработает отследить что нужные бары идут подряд (а это именно то, что нужно) или я чего-то не понял

Если не подряд, то счётчик обнуляется. O0

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

Добавлено: 25-10-2015 16:04:56


Всем привет! Не могу понять почему ордера не открываются) В этом деле новичок, нужна помощь.

Здесь просто: нужно код перенести из start() в OnTick() (старт потом удалить)

Изменено 25 октября, 2015 пользователем 0ll

#2677
0ll, ок, спс. На будущее... счетчики быстрее чем циклы?
#2678


0ll, ок, спс. На будущее... счетчики быстрее чем циклы?

В сотни раз. Цикл тоже на счётчике + вычисления внутри цикла и т.д.
#2679

Сложно сказать... в журнале пишет чего-нибудь. Если хотите чтоб проблема решалась нужно сову целиком выкладывать - ведь в тестере не запустишь кусочек...
ПС: это: if (OrderProfit()*(-1) > Zamok) можно писать более понятно: if (OrderProfit()

#2680


JR не нормальная. Цикл вообще не нужен. Просто счётчик баров с фильтром размера. Логика:
Если размер бара больше Х - счетчикБаровБай++ иначе =0
Если размер бара меньше -Х - счётчикБаровСелл++ иначе =0
Если счетчикБаровБай больше N - код
Если счётчикБаровСелл больше N - код

ПС: Естественно запускать счётчики на открытии бара.
ППС: после исполнения кода можно обнулить счётчик или нет - тебе решать.


Строго говоря, счетчикБаровБай надо обнулить, если последняя свеча медвежья - а счетчикБаровСэлл если последняя свеча бычья.
Вне зависимости от размера свечи.

В довольно странном :) учебном задании также выбраковываются все свечи меньше BarPipsMin (в абсолютном выражении).
то есть, по логике, при бар
ну и, имхо, лучше работать в абсолютных выражениях, чтобы не запутаться в знаках результатов опен-клоуз и/или клоуз-опен - уж какой вариант определения размера бара будет выбран при реализации.

Тогда что-то типа:
Если abs(клоуз-опен)Иначе Если клоуз>опен счетчикБаровБай++; счетчикБаровСэлл=0
иначе счетчикБаровСэлл++; счетчикБаровБай=0

Да?
#2681

Oll большое спасибо. Дешево и сердито. Вроде бы как работает. Одной проблемой меньше.

#2682


В довольно странном :) учебном задании также выбраковываются все свечи меньше BarPipsMin (в абсолютном выражении).


Немного разъясню (раскрою страшную тайну), чего я вас тут терроризирую )))
В качестве хобби и зарядки для ума изучаю MQL и пишу своего супер-сеточника. Как основу (пример) взял ApMGrid. Многое оттуда удалось повторить, кое-что не смог, в силу отсутствия времени и знаний, кое-что привнес свое. В частности изучаю разные режимы работы для сеточника-мартингейла. Индикаторый вход на базе болинджера+стохастик+рси повторить не составило труда, но захотелось добавить свои режимы.
Так вот например заметил, что на некоторых парах, после приведенного в качестве примера выше паттерна (2-4 свечи одного направления и не меньше X-пунктов) случается неплохой откат. Почему-бы не взять такой паттерн в качестве индикаторного входа для советника на мартингейле? Неточности как всегда закроем сеткой :)
Чтобы не быть голословным - картинка теста во вложении на AUDUSD. Это не грааль, но при мультивалютной торговле может показать неплохие результаты.

Собственно сов в активной стадии допиливания и тестирования, при согласии модераторов конечно планирую выложить для безвозмездного пользования форумчанам. Если оно им надо будет:)

TesterGraph1.gif

#2683
JR, в Лаборатория ProfitFX вход абсолютно свободный и всячески приветствуется!
Ограничение только одно - код должен быть собственной разработки или кого-то из форумчан или по заказу кого-то из форумчан.
Созреете - выкладывайте бота безоговорочно.

Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.
#2684

Спасибо за -Zamok

Вот цельный код.


Добавлено: 25-10-2015 21:47:59

в журнале есть ошибка но не знаю как ее исправить "OrderSend error 130" везде уже вставил MarketInfo ошибка сохраняется.

MAX.mq48 скач.

Изменено 26 октября, 2015 пользователем _Ugin_

#2685


Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.



Да я отдаю себе отчет, что во многих случаях "изобретаю велосипед" :) Просто, как уже писал, для меня это лишняя практика, тренинг и обучение, приносящее удовольствие )))
#2686

Там у Вас с общей логикой не лады. Сначала выставляете отложки, при этом вычисляете СтопЛосс, а когда дело доходит до рыночных ордеров стоп не вычисляете и пытаетесь открыть ордер со стопом от другого ордера. MarketInfo можно убрать.

#2687


Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.

v:) v:) v:)
JR не смотри ни в коем случае!!! если посмотришь, то не говори, что я тебя не предупреждал...
Просто живёшь спокойно, своего бота ковыряешь, а потом вот такое посмотришь и всё, писец, как дальше жить?
ПС: я смотрел (валерьянка не помогает)
ППС: Qj без обид - я в восхищении.
#2688



Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.



Да я отдаю себе отчет, что во многих случаях "изобретаю велосипед" :)
Просто, как уже писал, для меня это лишняя практика, тренинг и обучение, приносящее удовольствие )))

JR, в принципе, я сторонник обучения на чужих ботах.
Берешь действительно серьезную программу, изучаешь её до буковки, пока не поймешь абсолютно всё - и потом пробуешь её улучшить хоть немного.
Это обычно хорошая школа.

Вариант самостоятельной разработки любого бота с нуля тоже приемлем, но, имхо, хуже.
Проблема в том, что с опытом у программиста (особенно в общении с программистами) нарабатываются навыки оптимальной обработки неких стандартных ситуаций, использования инструментов и возможностей языка - а со временем набирается и наработанный проверенный код.
В обычном пеньке обычные люди видят лишь дрова - а столяр 2 табуретки. Видит и делает - потому что знает как, имеет навыки.
Обучаясь самостоятельно, не поработав подмастерьем у столяра, ты со временем станешь видеть и уметь больше - но даже просто табуретки быстро самостоятельно ты делать не научишься.

Но код от Qj я тоже не рекомендую - сложен для начинающих. Хорош - но сложен!
Кстати, код широко известного KimIV тоже, как по мне, сложен для начинающих: каждый блок прост - а в целом воспринимается сложно.

Ну а вообще программирование в удовольствие ничуть не хуже, чем писать прозу, рисовать или музицировать.
Вполне творческое и приносящее удовольствие занятие для тех, у кого есть к этому хоть какой-то талант.
#2689

Всех приветствую , не могу понять каким образом можно сохранить сигнал индюка не перебирая каждый раз бары. Задача состоит в том , чтобы при появлении сигнала индикатора, в советнике хранилось булевое значение в переменной и при необходимости через n-ное количество свечей можно было обратиться к этой переменной. Подскажите пожалуйста способ. Наверное есть какой либо способ забуферить значение , чтобы позволяло держать его там после каждого выполнения кода советника

Изменено 26 октября, 2015 пользователем Delirious

#2690



Что касается задуманной вами опции, то она уже реализована в безиндикаторном входе в [EA][Qj] - Setka v1.23, параметр ReversSignalToOpen1Order.
Код открыт - можете посмотреть.

v:) v:) v:)
JR не смотри ни в коем случае!!! если посмотришь, то не говори, что я тебя не предупреждал...
Просто живёшь спокойно, своего бота ковыряешь, а потом вот такое посмотришь и всё, писец, как дальше жить?
ПС: я смотрел (валерьянка не помогает)
ППС: Qj без обид - я в восхищении.

Извиняюсь за оффтоп, но это только начало :)
#2691

Глобальные переменные, сохранны даже после перезапуска терминала.
Вот Вам пример из моей торговой панели. Для обеспечения уникальности имени переменной для каждой пары используется префикс GVNamePrefix.
Имею смутное предположение, что они пишутся чуть ли не в реестр.

[SPOILER]
//---------------------------------------------------------------------------------------------
// Expert initialization function
//---------------------------------------------------------------------------------------------
int OnInit()
{
...
GVNamePrefix=GVNamePrefix0+Symbol()+"_";
GlobalVarablesRead();
...
//---
return(INIT_SUCCEEDED);
}

//---------------------------------------------------------------------------------------------
// Чтение глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesRead()
{
double _OrdersCount;
if (GlobalVariableGet(GVNamePrefix+"OrdersCount", _OrdersCount)) OrdersCount = _OrdersCount;
else OrdersCount = 0;
if (!GlobalVariableGet(GVNamePrefix+"LotSize", LotSize)) LotSize = 0;
if (!GlobalVariableGet(GVNamePrefix+"CurrTrend", CurrTrend)) CurrTrend = 0;
}

//---------------------------------------------------------------------------------------------
// Запись глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesWrite()
{
GlobalVariableSet(GVNamePrefix+"OrdersCount", OrdersCount);
GlobalVariableSet(GVNamePrefix+"LotSize", LotSize);
GlobalVariableSet(GVNamePrefix+"CurrTrend", CurrTrend);
}

#2692
Delirious сохранить можно любое значение. Вам какое? зачем нужно обращаться к сигналу, который остался в прошлом? а если будет другой сигнал, переписываем или все сигналы хранить будем?
#2693


Глобальные переменные, сохранны даже после перезапуска терминала.
Вот Вам пример из моей торговой панели. Для обеспечения уникальности имени переменной для каждой пары используется префикс GVNamePrefix.
Имею смутное предположение, что они пишутся чуть ли не в реестр.

[SPOILER]
//---------------------------------------------------------------------------------------------
// Expert initialization function
//---------------------------------------------------------------------------------------------
int OnInit()
{
...
GVNamePrefix=GVNamePrefix0+Symbol()+"_";
GlobalVarablesRead();
...
//---
return(INIT_SUCCEEDED);
}

//---------------------------------------------------------------------------------------------
// Чтение глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesRead()
{
double _OrdersCount;
if (GlobalVariableGet(GVNamePrefix+"OrdersCount", _OrdersCount)) OrdersCount = _OrdersCount;
else OrdersCount = 0;
if (!GlobalVariableGet(GVNamePrefix+"LotSize", LotSize)) LotSize = 0;
if (!GlobalVariableGet(GVNamePrefix+"CurrTrend", CurrTrend)) CurrTrend = 0;
}

//---------------------------------------------------------------------------------------------
// Запись глобальных переменных
//---------------------------------------------------------------------------------------------
void GlobalVarablesWrite()
{
GlobalVariableSet(GVNamePrefix+"OrdersCount", OrdersCount);
GlobalVariableSet(GVNamePrefix+"LotSize", LotSize);
GlobalVariableSet(GVNamePrefix+"CurrTrend", CurrTrend);
}



Спасибо! Опробую

Добавлено: 27-10-2015 07:14:21


Delirious сохранить можно любое значение. Вам какое? зачем нужно обращаться к сигналу, который остался в прошлом? а если будет другой сигнал, переписываем или все сигналы хранить будем?


Я писал , значение булевого типа. Суть в чём, предположим имеется канал и по идее должен произойти отбой от этого канала, но перед тем как это произойдёт цена может и дальше уходить за линию канала , так вот мы храним в переменной состояние , которое , грубо говоря, определяло бы перекупленность/перепроданность(в данном конкретном случае 2 переменных orderbuy = FALSE/TRUE, ordersell = TRUE/FALSE). Но входить в сделку мы будем, в тандеме с другим индикатором, более медленным, когда он будет подтверждать движение в интересующую нам сторону, что пора входить в сделки, но пока это произойдёт пройдёт n-ое количество свечей перед тем как оба индикатора будут показывать сигналы на покупку/продажу

Изменено 27 октября, 2015 пользователем Delirious

#2694

Ну это просто. Объявите переменную bool уровня программы (сразу после внешних переменных). Только не забудьте сбрасывать её в фальсе после использования. Глобальные переменные уровня терминала здесь в принципе не нужны. имхо.

#2695


Ну это просто. Объявите переменную bool уровня программы (сразу после внешних переменных). Только не забудьте сбрасывать её в фальсе после использования. Глобальные переменные уровня терминала здесь в принципе не нужны. имхо.



Согласен с Вами. Касаемо торгующего советника при реконнекте/включении терминала лучше пересчитать во избежание.
Правильно заданный вопрос - залог правильного ответа.
#2696

Премного благодарен! Помогло.

#2697

Друзья, здравствуйте! Помогите советом: есть робот, который работает так как и нужно, когда на счете только он один и на одной паре. Но как только стоит его же запустить на другую пару этого же счета, то все начинает глючить - выдает ошибку "не правильных параметров" (err 3). Хотя, магики разные... даже, специально сделал для каждой пары своего, отдельного, чтоб он не путался, но не помогло... Кто знает, как можно это исправить???? Цель - один робот на одном счете работает на разных параз. Заранее, благодарю.

#2698

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

int _GetLastError=0,_OrdersTotal=OrdersTotal();

for(int z=_OrdersTotal-1; z>=0; z --)
{

if(OrderSelect(z,SELECT_BY_POS)==true)
{



//---- если позиция открыта не по текущему инструменту, пропускаем её
if(OrderSymbol()!=Symbol()) continue;

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if(OrderMagicNumber()!=Magic) continue;

Print("ok");

}

else
{
order=OrderSend(Symbol(),OP_SELLSTOP,Lots*0.1,Bid-Otstup*Point,3,0,0,Magic+" "+Symbol(),Magic,0,Green);
}
Sleep(20000);
}

#2699

int order_type;

// это делаем после того, как ордер выбран
order_type=OrderType();

// вот проверка что ордер отложенный
if (order_type==OP_BUYSTOP || order_type==OP_BUYLIMIT || order_type==OP_SELLSTOP || order_type==OP_SELLLIMIT)
break; // сами же говорили, чтоб открывался только один

*** На всякий случай документация по типам ордеров _docs.mql4.com/ru/trading/ordertype

Изменено 29 октября, 2015 пользователем st2050

#2700
grave Вы открытие ордера не туда поместили... Логика Вашей программы сейчас такова:
- Цикл по ордерам
- Если ордер выделен успешно (select), то проверяем символ и магик. и дальше ничего!?
если ордер не выбран, то открываем новый! - это не правильно.

Поправьте общую логику. и согласен с st2050 нужна сортировка по типу и вот тогда, если данного типа нет - открытие.:
//сначала (до цикла) определяем счётчики:
int countSS=0, countBS=0;
//туда, где Print("ok") пишем:
if (order_type==OP_BUYSTOP) countBS++;
if (order_type==OP_SELLSTOP) countSS++;
//после выхода из цикла туда где Sleep(20000) (а лучше вместо):
if (countBS == 0) //открываем БайСтоп
if (countSS == 0) //открываем СеллСтоп

ПС: зачем Вам Sleep(20000);?

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025