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

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

#4351

Я пробую к примеру int Total = OrderCount(-1, 0, "USDCHF"); только по паре.
но у меня не определяется OrderCount, пишет ошибку


Еще бы, все верно, ф-ция OrdersTotal() является терминальной, Вам нужно самому написать, что, как я понимаю, мало вероятно, тогда поройтесь по другим кодам советников у которых есть подсчет ордеров установленных самим советником, посмотрите как там сделано и повторите в своем коде, как-то так.
#4352

OrderCount,



Я пробую к примеру int Total = OrderCount(-1, 0, "USDCHF"); только по паре.
но у меня не определяется OrderCount, пишет ошибку


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

я про OrderCount, а не OrdersTotal()

Добавлено: 11-04-2017 22:35:10

8 часов шуршания на различных форумах и вот что собрал:

Перед открытием позиций бай и селл :


{
// Buy
//-----------------------------------------------------------------------------------
for(int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType() return(0);
{
}
}
}
//------------------------------------------------------------------------------------
И аналогично в селл только с переменной "i1".

total убрал, если символ и магик совпадает, то всё открывается как нужно, так же при тесте менял в коде пару и магик, и бот начинает открывать тысячи ордеров, значит всё должно быть в порядке.

Всем спасибо !

Изменено 12 апреля, 2017 пользователем Levis_rock

#4353

То что тормозит, то тут нет ничего удивительного. Тормозить может, и скорее всего, из-за тяжелых алгоритмов самих индикаторов. Не факт, что индикаторы какие-то кривые, просто Вы используете 4 индикатора (8 буферов). При этом Вы на каждом тике проверяете все 8 буферов. При каждом обращении к буферу производятся вычисления в индикаторах. Вот и представьте себе объем этих вычислений. Если ТС не требует проверки показателей индикаторов на каждом тике, то можно тут оптимизировать (например, проверять с интервалом от нескольких секунд, а может и раз в минуту). Возможно не нужно следить за индикаторами, когда позиция в рынке... Ну и т.д. Все зависит от стратегии.
В конце тестирования в режиме визуализации на графике рисуются все индикаторы, которые используются - это норма.



Здравствуйте!
Разобрался со своим вопросиком. Мой косяк был в том, что я брал данные из комплексного индикатора, который, в свою очередь, брал данные из исходных индикаторов.
Когда взял исходные индикаторы, все получилось. Если кому будет интересно, выкладываю советник и индикаторы. Советник простенький, делал только для проверки стратегии.
Стратегия отличается от классической Genesis Matrix, в ней используются только сигналы матрицы Genesis на таймфреймах М5 и Н1. Если все 8 сигналов на покупку - покупаем, если на М5 все сигналы на продажу - выходим из покупки. Для продажи - аналогично.

Добавлено: 13-04-2017 06:42:58

Здравствуйте!
Кто подскажет, как выставить время на закрытие ордера на следующий день после открытия? В текущий день - понятно, а вот на следующий что-то не соображу.

Genesis_Generic.mq44 скач.
GannHiLo-Histo.mq44 скач.
T3_2ColorHisto.mq44 скач.
TVI.mq44 скач.

Изменено 13 апреля, 2017 пользователем Vasiliy Pupkin

#4354

Здравствуйте!
Кто подскажет, как выставить время на закрытие ордера на следующий день после открытия? В текущий день - понятно, а вот на следующий что-то не соображу.



Здравствуйте! Примерно так можно.

datetime TimeClose=D'2017.02.01 00:00';//время, когда необходимо закрыть
int orderTicket=12345;//тикет закрываемого ордера
if(TimeCurrent()>=TimeClose)
{
if(OrderSelect(orderTicket,SELECT_BY_TICKET))
{
OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE);
}
}

#4355

Помогите плз с кодом пина для дашборда.

Есть условие:

int pin( int i ) {
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer) // это условие нужно записать в зависимости от symbols[]
return(2);
if (ExtRedBuffer) //и это условие нужно записать в зависимости от symbols[]
return(1);

return( 0 );
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};

Так вот - каким макаром возвращять условие по каждой паре из symbols[] в pin() + return 1 или 2 от пары и выполненных условий??

Заранее спасибо.................

Изменено 16 апреля, 2017 пользователем sniv

#4356

Можно сделать так:


int pin( int i ) {
double ExtRedBuffer = iCustom(symbols,0,"SampleInd",13,0,1);
double ExtLimeBuffer = iCustom(symbols,0,"SampleInd",13,1,1);
double ExtBlueBuffer = iCustom(symbols,0,"SampleInd",13,2,1);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer return(1);
return(0);
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};
#4357


Можно сделать так:


int pin( int i ) {
double ExtRedBuffer = iCustom(symbols,0,"SampleInd",13,0,1);
double ExtLimeBuffer = iCustom(symbols,0,"SampleInd",13,1,1);
double ExtBlueBuffer = iCustom(symbols,0,"SampleInd",13,2,1);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer return(1);
return(0);
}

string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"};




Пасиб)
когда пишу так -


ExtBlueBuffer=iMA(symbols,timeframe,InpJawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
ExtRedBuffer=iMA(symbols,timeframe,InpTeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
ExtLimeBuffer=iMA(symbols,timeframe,InpLipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,InpLipsShift);
if (ExtRedBuffer>ExtLimeBuffer>ExtBlueBuffer)
return(2);
if (ExtRedBuffer)
return(1);


получаю 100% вылет из массива, т.к symbols[] ессессенно за ним((
и еще: c iCustom понятно, но вписываю код в сам индикатор, поэтому не понятно как возвращать return именно для конкретной symbols[]
#4358

Всю ветку еще не прочел. Подскажите как закрыть ордер по профиту учитывая накопившийся своп?

#4359

Всю ветку еще не прочел. Подскажите как закрыть ордер по профиту учитывая накопившийся своп?


Если совсем кратко, то рассчитать профит с учетом свопа так:
double profit = (OrderProfit()+OrderSwap());
а если еще и с учетом комиссии, то так:
double profit = (OrderProfit()+OrderSwap()+OrderCommission());

А если подробно, то надо сначала выбрать нужный ордер, а потом уже его закрыть. Примерно так:

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic
&& (OrderType() == OP_BUY || OrderType() == OP_SELL))//какой тип выбирайте сами
{
double profit=(OrderProfit()+OrderSwap()+OrderCommission());
if(profit > 0)// или больше какого-то порога
{
//закрываете с помощью функции OrderClose()
}
}
}
}

Изменено 17 апреля, 2017 пользователем Sergey Forex

#4360

Всем здравствуйте! Я тут как-то скачивал видео-уроки(у меня очень плохая память на имена существительные, так что имя автора уроков я не помню), и уже, где-то недели три занимаюсь и стараюсь научиться языку программирования MQL4. Сложновато. Но учиться надо однозначно. Скопировал из уроков себе советника на основе Мартингейла(на мой взгляд это самый, что ни на есть, прибыльный ход развивающихся событий). И в данный момент нахожусь в состоянии познания. Только что прочитал статью, о графике ADX. Статья понравилась и я подумал:"А не прицепить мне к своему Мартингейлу график ADX. Подумал и прицепил. И что получилось?! А получилось следующее, раньше по валютной паре EUR/USD, с начальным депозитом 1000 долларов, лотом 0.1 и удвоением ставки на 1.5, он давал прибыль за прошедший год 6000 тысяч долларов с небольшим перевесом в плюс. И только что проверил его с графиком ADX, прибыль уменьшилась до 5500 долларов. Но увеличилось количество правильных сделок, то есть, в сторону тренда. И заметно уменшилось волнение за слив депозита, так как советник открывал правильные сделки. Значит можно увеличить лот(скорей всего). Программирование - штука хорошая, интересная. А еще интересна она тем, что тут(в программировании), еще нет женщин - им пока это не интересно, то есть, их эмоциональное мышление плохо подчиняется логическому мышлению. Так что программирование - это своего рода рыбалка будущего. Повар - мужского рода, но за плитой на кухне, обычно руководят женщины.

#4361

Или хоть в этом---
есть:
какие-то параметры
string symbols[] = { "AUDCAD","AUDCHF","AUDJPY"}
int aa;
int bb;

у каждой валютной пары аа и bb разные

и я хочу написать условие от Symbols() т.е к примеру


int blabla( int i ) {

if (aa>bb) //Как проверять это условие в зависимости от Symbols()??
return(1);
else
return(4);
return(0);
}


вот так:

if (aa>bb && Symbols()==symbols)

не работает

Изменено 17 апреля, 2017 пользователем sniv

#4362

Здравствуйте!
Кто подскажет, как выставить время на закрытие ордера на следующий день после открытия? В текущий день - понятно, а вот на следующий что-то не соображу.

Здравствуйте! Примерно так можно.


Код: [Выделить]
datetime TimeClose=D'2017.02.01 00:00';//время, когда необходимо закрыть
int orderTicket=12345;//тикет закрываемого ордера
if(TimeCurrent()>=TimeClose)
{
if(OrderSelect(orderTicket,SELECT_BY_TICKET))
{
OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE);
}
}


Спасибо за ответ!
Не догнал, что можно было бы просто "TimeCurrent()>=TimeClose", еще никак не привыкну к машинной логике :-)
#4363

Добрый день, коллега!
Если у каждой валютной пары aa и bb разные, то так:

string symbols[] = {"AUDCAD","AUDCHF","AUDJPY"};
int aa[] = {3, 5, 6};
int bb[] = {4, 9, 8};

и далее сама функция:
int blabla(int i)  // где, i - индекс валютной пары в массиве
{
if (aa > bb && Symbols() == symbols)
return(1);
else
return(4);
return(0);
}
#4364

Здравствуйте! Может кто подскажет, как написать функцию подсчёта профита сетки локирующих ордеров?

#4365

Здравствуйте все!

Подскажите, пожалуйста, как решить вот такую засаду:

вставил в советник рисование стрелок вот так

ArrowUpCreate(0,"ArrowUp"+(string)TimeCurrent(),0,0,0,ANCHOR_TOP,clrTeal,STYLE_SOLID,3,false,false,true,0);

Во время тестирования с визуализацией они исправно рисуются там где надо, но после тестирования (когда закрою окно визуализатора) в окне графика видны только сделки (открытие и закрытие), но нет моих стрелок. Нет их и после тестирования без визуализации.

Вопрос: как сделать отображение моих стрелок на графике безусловно?
#4366

Чет не совсем понимаю. Вы хотите, чтобы после прогона советника в тестере у вас появлялись стрелки на реальном графике инструмента?

#4367

Вы хотите, чтобы после прогона советника в тестере у вас появлялись стрелки на реальном графике инструмента?


Ну, да. Как после прогона в тестере появляется отображение сделок.
#4368

Ну, да. Как после прогона в тестере появляется отображение сделок.



Когда вы прогоняете в тестере в режиме визуализации, то естественно стрелки рисуются на графике, где этот тест визуализируется. Тест никак не связан с реальным текущим открытым графиком (-ми) инструмента. Поэтому стрелки, которые были нарисованы в режиме визуализации не отображаются на реальном графике. Чтобы перенести стрелки, нарисованные в тестере, на реальный график нужны танцы с бубном. Можно, например, данные этих стрелок ( время, цена и т.п.) во время тестирования сохранять в файл. А уже после теста из файла переносить скриптом на нужный график.
#4369

Чтобы перенести стрелки, нарисованные в тестере, на реальный график нужны танцы с бубном


Спасибо, DreamWorks!
Я уж тоже понял, что так просто не получится :(
#4370

Привет, коллеги!
Как и многие здесь, тоже начал изучать язык по урокам с сайта.
В домашке к третьему уроку столкнулся с задачей: не открывает отложку с ошибкой 130 (неверный стоп). Даже при стопе = 0. Уже и MarketInfo() подключил - все равно пишет ошибку в тестере. При компиляции все нормально.
Вот код:
case 2: // работаем отложками

//--- получим минимальное значение Stop level
minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");

MSL = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point, Digits) + MSL;
SellStop = NormalizeDouble(PriceLow - PipStop*Point, Digits) - MSL;


if (CountBuy() == 0 && Bid >= PriceHigh)
{
SL = NormalizeDouble(TMACentr - minstoplevel*Point - indent*Point, Digits);
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);

ticket = OrderSend(Symbol(), OP_BUYSTOP, Lot, BuyStop, Slippage, SL, TP, "TMA Fair", Magic, 0, Blue);

if (ticket Print ("Не удалось открыть отложенный ордер на покупку");
}
if (CountSell() == 0 && Ask {
SL = NormalizeDouble(TMACentr + minstoplevel*Point + indent*Point, Digits);
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);

ticket = OrderSend(Symbol(), OP_SELLSTOP, Lot, SellStop, Slippage, SL, TP, "TMA Fair", Magic, 0, Red);

if (ticket Print ("Не удалось открыть отложенный ордер на продажу");
} break;
Подскажите, что не так?

#4371

На Sell тейкпрофит меньше цены открытия, т. е. нужно отнимать. И не от хая, а от лоу. По моему так.

Изменено 23 апреля, 2017 пользователем ANDRON74

#4372


На Sell тейкпрофит меньше цены открытия, т. е. нужно отнимать. И не от хая, а от лоу. По моему так.


Спасибо за указанную ошибку - глаз замылился, наверное) Исправил. Но все равно дает 130 ошибку...
#4373
well72, Вы задаете ТП TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow)*Point, Digits);
насколько я понимаю PriceHigh, PriceHigh, PriceLow это все цена. Не надо умножать ее на пункты:
TP = NormalizeDouble(PriceHigh + (PriceHigh - PriceLow), Digits);

а здесь:
MSL      = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point, Digits) + MSL;
SellStop = NormalizeDouble(PriceLow - PipStop*Point, Digits) - MSL;

я бы сделал так:
MSL      = NormalizeDouble (minstoplevel*Point, Digits);
BuyStop = NormalizeDouble(PriceHigh + PipStop*Point + MSL, Digits);
SellStop = NormalizeDouble(PriceLow - PipStop*Point - MSL, Digits);


или, чтобы советник не ругался на счет неправильных стопов из-за стоплевела, то так лучше сделать так:
if(PipStop if(indent 



Изменено 23 апреля, 2017 пользователем Sergey Forex

#4374

Спасибо, Сергей! Все заработало.
Надо будет в case 3 еще сделать так, чтобы бот удалял не отработавшую страховочную отложку, если сработал маркет. Или сделать выбор во внешних - удалять или нет.
А лучше, думаю, буде удалять отложку при закрытии маркета тейком.
Кстати, вопрос: в уроках ведущий то использует скобки в операторе if, то не использует. Так и не могу определиться: нужны они или нет?

Изменено 23 апреля, 2017 пользователем well72

#4375

Добрый день, начал обучение Mql4, прошел уроки и дом. зд., начал писать советник на индикаторе Slope Direction Line!Идея в том, чтобы сова открывала ордер на 2й свече после перекрашивания индикатора. С моими знаниями написал это (во вложение), объясните пожалуйста в чем ошибка?

slope2.ex40 скач.
slope2.mq41 скач.

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

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