Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 70

 

Уважаемые форумчане!

Просьба помочь, проблемы следующие: 1) Как прописать в коде, чтобы сделка, скажем, на SELL, открывалась при достижении верхней границы канала, а закрывалась при достижении нижней границы; 2) При одном сигнале должна открываться только одна сделка; 3) при установке советника сделка открывается сразу, а нужно, чтобы сделка открывалась только при достижении линии канала.

Буду благодарен за помощь.

extern double Lots = 0.1;
extern int TakeProfit = 30; //тейкпрофит (отрицательное число или ноль чтобы не использовать);
extern int StopLoss = 20; // уровень Stop Loss для покупки;
extern int Slippage = 2; // проскальзывание
extern string Сomment = "Keller";
extern int Magic = 333;

extern string Indi = "Данные индикатора";
extern string TimeFrame = "current time frame";
extern int MA_Period = 10; // 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int Mode_MA = 0; // 0 - Close, 1 - Open, 2 - High, 3 - Low, 4 - Median, 5 - Typical, 6 - Weighted
extern int Price_Type = 5;

double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // для пятизначного брокера
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom (Symbol(), 0, "Keller", TimeFrame, MA_Period, Mode_MA, Price_Type, 0, 0); // красная верхняя буфер 0
PriceLow = iCustom (Symbol(), 0, "Tma", TimeFrame, MA_Period, Mode_MA, Price_Type, 2, 0); // красная нижняя буфер 2

if (Bid >= PriceHigh && CountSell() == 0) // где Countsell проверка, что бы ордера открывались по одному, а не на каждом тике
{
SL = NormalizeDouble (Bid + StopLoss * Point, Digits);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, Сomment, Magic, 0, Red); // где 0 это SL и TP (для есн счетов ставится 0) и последний 0 - это эксперейшен
if (ticket > 0) // проверка наличия открытого ордера
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // где 0 - это эксперейшен
}
}


if (Ask <= PriceLow && CountBuy() == 0)// где Countsell проверка, что бы ордера открывались по одному, а не на каждом тике
{
SL = NormalizeDouble (Ask - StopLoss * Point, Digits);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, Сomment, Magic, 0, Blue); // где 0 это SL и TP (для есн счетов ставится 0) и последний 0 - это эксперейшен
if (ticket > 0) // проверка наличия открытого ордера
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // где 0 - это эксперейшен
}
}


if (Bid >= PriceHigh && CountBuy() > 0) // если цена достигла верхней границы канала и количество ордеров больше 0
{
for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) // проверка наш ли это ордер на покупку
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black); // закрываем ордер на верхней границе канала
}
}
}
if (Ask <= PriceLow && CountSell() > 0) // если цена достигла нижней границы канала и количество ордеров больше 0
{
for ( i=OrdersTotal()-1; i >= 0; i--) // определение переменной для buy уже int не ставится
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL) // проверка наш ли это ордер на продажу
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black); // закрываем ордер на нижней границе канала
}
}
}

return(0);
}

//+------------------------------------------------------------------+
int CountSell()// проверка - количество ордеров на продажу, которые в работе
{
int Count = 0;
for (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
Count++;
}
}
return(Count);
}
//+------------------------------------------------------------------+
int CountBuy()// проверка - количество ордеров на покупку, которые в работе
{
int Count = 0;
for (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
Count++;
}
}
return(Count);
}

 
Добавляю скрин
 
artmedia70:

Нет, не разошлись. Мельком глянул на ваш код и ответил "не глядя". Ваша строка:

- присваивает индексу цикла i величину, равную общему количеству горизонтальных линий. Если их у вас 3, то и цикл будет от 2 до 0. А там уж, что в вашем цикле - неясно, но будет всего три итерации от 2 до 0.


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

for(int i=ObjectsTotal(OBJ_HLINE)-1; i>=0; i--) 

И на вскидку работало правильно. Но сомнения именно в описанном Вами как раз и возникали. Поэтому и хотел уточнить этот аспект.

И рад, что Ваши мнения согласованно подтвердили и мое предположение. Будем считать, что определенность в этом вопросе достигнута.

Еще раз Большое Спасибо!

 
bistreevseh:


есть индикатор у меня, кастомный, идёт гистограммой, причём все значения максимальные, имеет значение, лишь цвет баров в гистограмме, входных параметров у него нет, буфера 2 : 0 - с красным цветом бара, и 1- синий цвет бара, Империческим методом я выяснил, что в 0 буфер, не меняется значение, а в 1 меняется. Как написать критерии для сделки не могу понять, пожалуйста объясните как, заранее спасибо.


Если есть исходный код индикатора, то совсем не сложно: Смотрим исходный код и находим в индикаторе условия для смены цвета. По ним формируем сигнал. Сделать это можно 2-мя способами: первым - написав "обертку" для анализа условий смены значений буферов при этом код индикатора не меняется, используется iCustom(), 2-й преобразовав код индикатора в функцию, которую можно вызвать из эксперта. Оба способа описаны в статьях на сайте.

Если есть интерес, например, к сглаженному Хейкин-Аши - поройтесь по сайту - по этому индикатору было обсуждение, насколько я помню, обсуждали и правильность алгоритма и анализ сигналов. Код его открыт и есть в базе кодов (там вообще много чего есть).

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

 
VladislavVG:

Если есть исходный код индикатора, то совсем не сложно: Смотрим исходный код и находим в индикаторе условия для смены цвета. По ним формируем сигнал. Сделать это можно 2-мя способами: первым - написав "обертку" для анализа условий смены значений буферов при этом код индикатора не меняется, используется iCustom(), 2-й преобразовав код индикатора в функцию, которую можно вызвать из эксперта. Оба способа описаны в статьях на сайте.

Если есть интерес, например, к сглаженному Хейкин-Аши - поройтесь по сайту - по этому индикатору было обсуждение, насколько я помню, обсуждали и правильность алгоритма и анализ сигналов. Код его открыт и есть в базе кодов (там вообще много чего есть).

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


большое спасибо, буду пробовать. Не могли бы вы помочь мне с поиском статей по поводу "обёртки" и преобразованию кода индикатора, т.к. боюсь, не смогу интерпретировать это в поисковый запрос.
 
Помогите, пожалуйста. Индикатор рисует линии high и low предыдущего дня. Нужно чтобы он рисовал линии на истории каждый день. Спасибо.
Файлы:
line.mq4  3 kb
 
prom18:
Помогите, пожалуйста. Индикатор рисует линии high и low предыдущего дня. Нужно чтобы он рисовал линии на истории каждый день. Спасибо.
Файлы:
line_1.mq4  3 kb
 
bistreevseh:

большое спасибо, буду пробовать. Не могли бы вы помочь мне с поиском статей по поводу "обёртки" и преобразованию кода индикатора, т.к. боюсь, не смогу интерпретировать это в поисковый запрос.


https://www.mql5.com/ru/forum/114117 здесь пример создания функции-обертки для интерпретации сигналов индикатора

вот статьи по использованию кодов индикаторов:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457

 
Vinin:



Спасибо!
 
VladislavVG:


https://www.mql5.com/ru/forum/114117 здесь пример создания функции-обертки для интерпретации сигналов индикатора

вот статьи по использованию кодов индикаторов:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457


ещё раз, большое спасибо
Причина обращения: