Перейти к содержанию

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


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)

Всем привет! И спасибо за Спасибо!
Сам учусь, так что если не ответил - ответа пока не знаю ;)


уважаемые форумчане. написал эксперт на основе внешнего индикатора... на валютных парах работает, а на золоте или нефти выдает OrderSend error 131 ... в чем может быть причина ???


131 - неправильный объём (мелкий лот?). Нужно узнать минимальный объём разрешённый по инструменту и шаг:
MarketInfo(Symbol(), MODE_MINLOT)
MarketInfo(Symbol(), MODE_LOTSTEP)



Уважаемый Vorchunozavr спасибо за код,еще такое дело. Как дополнить бота что бы при достижении первого тейк профита ордер переводился в без убыток,а дальше тралился как есть ? Поможете буду очень признателен !!! Прилагаю код.


BU_1, во внешние переменные и в проверку на Digits.
Добавил две функции.
Спойлер

 //+------------------------------------------------------------------+
void PartClose()
{ for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderLots() {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if ((Bid - OrderOpenPrice())/Point >= Profit_1 && OrderLots() > Lots - LotsClose)
{
OrderClose(OrderTicket(), LotsClose, Bid, Slippage);
BU_Buy(); //--- Переводим в БУ
}

if ((Bid - OrderOpenPrice())/Point >= Profit_2 && OrderLots() > Lots - LotsClose*2)
OrderClose(OrderTicket(), LotsClose, Bid, Slippage);
}

if (OrderType() == OP_SELL)
{
if ((OrderOpenPrice() - Ask)/Point >= Profit_1 && OrderLots() > Lots - LotsClose)
{
OrderClose(OrderTicket(), LotsClose, Ask, Slippage);
BU_Sell(); //--- Переводим в БУ
}

if ((OrderOpenPrice() - Ask)/Point >= Profit_2 && OrderLots() > Lots - LotsClose*2)
OrderClose(OrderTicket(), LotsClose, Ask, Slippage);
}
}
}
}
}
}
//+------------------------------------------------------------------+
int BU_Buy()
{
for (int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if ((Bid - OrderOpenPrice())/Point >= Profit_1 && OrderLots() == Lots - LotsClose)
{
Sl = NormalizeDouble(OrderOpenPrice() + BU_1*Point, Digits);
if (OrderStopLoss() != Sl && OrderStopLoss() OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(),0);
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
int BU_Sell()
{
for (int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
{
if ((OrderOpenPrice() - Ask)/Point >= Profit_1 && OrderLots() == Lots - LotsClose)
{
Sl = NormalizeDouble(OrderOpenPrice() - BU_1*Point, Digits);
if (OrderStopLoss() != Sl && OrderStopLoss() > Sl)
OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(),0);
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+

Если кто-то знает, как сделать проще, буду рад увидеть.

Добавлено: 01-10-2013 08:11:33


if(Bid >=price + Step * Point)

Так чтоли?

Да, так.

А почему void GetSignal()?
Нам же нужно значение Signal.
Лучше int GetSignal() & return(Signal).
Спойлер

int GetSignal()
{
Signal = 0;

// - 1 - == Получение показаний индикатора ==============================================
double main1 = iCustom(NULL, 0, "Trend", 0, 1);
double main2 = iCustom(NULL, 0, "Trend", 0, 2);
double sign1 = iCustom(NULL, 0, "Trend", 1, 1);
double sign2 = iCustom(NULL, 0, "Trend", 1, 2);
// - 1 - == Окончание блока =============================================================

// - 2 - == Генерация сигнала покупки ===================================================
if (main1 != EMPTY_VALUE && main2 != EMPTY_VALUE// Линия сменила цвет с красного на..
&& sign1 == EMPTY_VALUE && sign2 != EMPTY_VALUE)// ..голубой
Signal = 1;
// - 2 - == Окончание блока =============================================================

// - 3 - == Генерация сигнала продажи ===================================================
if (sign1 != EMPTY_VALUE && sign2 != EMPTY_VALUE// Линия сменила цвет с голубого на..
&& main1 == EMPTY_VALUE && main2 != EMPTY_VALUE)// .. красный
Signal = -1;
// - 3 - == Окончание блока =============================================================
return(Signal);
}
Изменено пользователем Vorchunozavr
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

В целях закрепления материала на внешнем индюке, взял внешний индюк на пересечение стохастика, если буфер 1 продавать если 0 покупать, только кого с кем сравнивать не пойму, в уроке индюк был на графике, а этот просто стрелки рисует....


double Sell = iCustom ( Symbol(), 0, "Stochastic_Cross_Alert", KPeriod, DPeriod, Slowing,
MA_Method, PriceField, OverBoughtLevel, OverSoldLevel, show_KD_cross,
show_K_OBOScross, show_D_OBOScross, 1, 0 );

double Buy = iCustom ( Symbol(), 0, "Stochastic_Cross_Alert", KPeriod, DPeriod, Slowing,
MA_Method, PriceField, OverBoughtLevel, OverSoldLevel, show_KD_cross,
show_K_OBOScross, show_D_OBOScross, 0, 0 );

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)


Подскажите пожалуйста, условие else В = 0, будет выполняться для if (А > Б ) = 1 ?

if (А > Б ) В = 1;
else { if (А


Спойлер

if  (А > Б ) 
{
В = 1;
}
else if (А {
В = -1;
}
else //-- Если А = Б ?
{
В = 0 ;
}
Изменено пользователем Vorchunozavr
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемый Vorchunozavr Спасибо за код,буду пробовать оптимизировать его.В общем на тесте вроде бы дает положительный результат с натяжкой и на демку поставлю,посмотрим чего с этого получится !!! :d :d :d

Ссылка на сообщение
Поделиться на другие сайты

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



Подскажите пожалуйста, условие else В = 0, будет выполняться для if (А > Б ) = 1 ?

if (А > Б ) В = 1;
else { if (А


Спойлер

if  (А > Б ) 
{
В = 1;
}
else if (А {
В = -1;
}
else //-- Если А = Б ?
{
В = 0 ;
}



Да, if (А = Б) B = 0;

Пробую оптимизировать, как в учебнике
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
v
Будет работать и Ваше и моё, просто я более наглядно нарисовал...


Уважаемый Vorchunozavr Спасибо за код,буду пробовать оптимизировать его.В общем на тесте вроде бы дает положительный результат с натяжкой и на демку поставлю,посмотрим чего с этого получится !!! :d :d :d


Пожалуйста :)
На счёт оптимизации:
Надо смотреть приносит-ли пользу частичное закрытие и перевод в БУ, ведь стоп мы получаем в полном объёме, а прибыль ограничиваем...
Ссылка на сообщение
Поделиться на другие сайты

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

Я вот только не понял,функцию трелинга можно выкинуть из кода совсем получается.В общем мне нужно при достижении определенного количества пунктов закрылась часть ордера и перевелась в без убыток,при закрытии второй части,стоп лосс переводился на место закрытия первой части.Как то так.Сегодня смотрел его на тесторе,пока еще не понял как он работает. :d Там все в куче,запутался на прочь,хоть содись и все заново переписывай.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)

Всем привет! :)

Некоторые жаловались, что после урока №1, второй урок оказался гораздо сложней, и так и не смогли двигаться дальше.

Итак, готовится к выходу урок № 1.5
У кого-то остались вопросы после просмотра урока №2 ?
Постараюсь ответить на Ваши вопросы в уроке № "Полтора" :)


Добавлено: 03-10-2013 09:26:33


Здравствуйте. Спасибо за отличные уроки. Домашнее задание



Я посмотрел решение задания №3
Итак, по пунктам:

Цитата

1. закрытие рыночных ордеров происходило не на противоположной границе канала, а на средней линии.



С этим всё в порядке.

Цитата

2. Добавить в советник сигналы индикатора «Стохастик» и совместить с сигналами индикатора «ТМА».



Тут почти всё в порядке, за исключением того, что я бы сделал не так...
Проверил бы не одно значение а два, и сравнивал бы их между собой для начала, т.е. идёт-ли повышение или понижение значения, а не просто "выше", "ниже"...

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

Тут Вы ставите лимитники, а я просил ставить стоп-ордера для страховки...
Изменено пользователем xbms
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

не удаляются рыночные ордера:

"OrderDelete error 4108" Неверный номер тикета
Спойлер



extern double Lot = 0.01;
extern double LotPerc = 0.01;
extern double RiskEquity = 0.7;
extern double StopLoss = 20;
extern double TakeProfit = 30;
extern int BarCount = 10;
extern double Multi = 2;
extern int TimeBegin = 5;
extern int TimeEnd = 19;
extern double Slipagge = 3;
extern double Step = 10;
extern int magic = 1123111;

double OpenPriceBuy, OpenPriceSell, minprice, maxprice, NewLot, SL, TP; int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
Slipagge *= 10;
Step *= 10;
StopLoss *= 10;
TakeProfit *= 10;

}


return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//+------------------------------------------------------------------+

if ( TimeEnd == TimeHour(TimeCurrent()) )

{
DeleteOrders();
}

//+------------------------------------------------------------------+

double x, y, z;

x = AccountBalance()*RiskEquity;
y = AccountEquity ();
z = AccountEquity ()/AccountBalance()*100;
Comment (z);

if (y { for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if (OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), Bid, Slipagge, Blue);
if (OrderType() == OP_SELL ) OrderClose(OrderTicket(), OrderLots(), Ask, Slipagge, Red );
}
}
}

//+------------------------------------------------------------------+

NewLot = AccountBalance()*LotPerc/1000;
if ( NewLot
//+------------------------------------------------------------------+
//minprice = NormalizeDouble ( GetMinPrice ()-Step*Point, Digits );
//maxprice = NormalizeDouble ( GetMaxPrice ()+Step*Point, Digits );
OpenPriceSell = NormalizeDouble ( GetOpenPrice()-Step*Point, Digits );
OpenPriceBuy = NormalizeDouble ( GetOpenPrice()+Step*Point, Digits );

{

if ( TimeBegin = TimeHour(TimeCurrent()) && CountBuy() == 0 && CountSell() == 0 )

{
SL = NormalizeDouble (OpenPriceSell + StopLoss * Point, Digits);
TP = NormalizeDouble (OpenPriceSell - TakeProfit * Point, Digits);
ticket = OrderSend (Symbol(), OP_SELL, NewLot, OpenPriceSell, Slipagge, 0, 0, "0", magic, 0, Red );
if (ticket > 0)
{
if ( OrderSelect ( ticket, SELECT_BY_TICKET, MODE_TRADES ) == true )
{
OrderModify ( ticket, OrderOpenPrice(), SL, TP, 0 );
}
}

SL = NormalizeDouble (OpenPriceBuy - StopLoss * Point, Digits);
TP = NormalizeDouble (OpenPriceBuy + TakeProfit * Point, Digits);
ticket = OrderSend (Symbol(), OP_BUY, NewLot, OpenPriceBuy, Slipagge, 0, 0, "0", magic, 0, Blue );
if (ticket > 0)
{
if ( OrderSelect ( ticket, SELECT_BY_TICKET, MODE_TRADES ) == true )
{
OrderModify ( ticket, OrderOpenPrice(), SL, TP, 0 );
}
}
}



}
return(0);
}
//+------------------------------------------------------------------+
//| expert function |
//+------------------------------------------------------------------+

double GetMinPrice()
{
double dLow = 1000000,
dPrice ;
for (int i=1; i {
dPrice = iLow(Symbol(), 0, i);
if (dPrice dLow = dPrice;
}
return (dLow);
}

//+------------------------------------------------------------------+

double GetMaxPrice()
{
double dHigh = 0,
dPrice ;
for (int i=1; i {
dPrice = iHigh(Symbol(), 0, i);
if (dPrice > dHigh)
dHigh = dPrice;
}
return (dHigh);
}

//+------------------------------------------------------------------+

double GetOpenPrice ()
{
double open;

open = iOpen ( Symbol(), 0, 0 );

return (open);
}

//+------------------------------------------------------------------+

int CountBuy ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == magic )
{
if(OrderType() == OP_BUY)
count++;
}
}
return(count);
}

//+------------------------------------------------------------------+

int CountSell ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == magic )
{
if(OrderType() == OP_SELL)
count++;
}
}
return(count);
}

//+------------------------------------------------------------------+

int CountBuyStop ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == magic )
{
if(OrderType() == OP_BUYSTOP)
count++;
}
}
return(count);
}

//+------------------------------------------------------------------+

int CountSellStop ()
{
int count = 0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS);
if (OrderSymbol() == Symbol() && OrderMagicNumber () == magic )
{
if(OrderType() == OP_SELLSTOP)
count++;
}
}
return(count);
}

//+------------------------------------------------------------------+

void DeleteOrders ()
{
for ( int trade = OrdersTotal()-1; trade>=0; trade-- )
{
OrderSelect ( trade, SELECT_BY_POS, MODE_TRADES );
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
OrderDelete (OrderTicket(), Black );
}
}
}

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+



а это вообще не пойму что такое, реквоты в тестере???

"OrderSend error 138" Новые цены


Ссылка на сообщение
Поделиться на другие сайты

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



не удаляются рыночные ордера:

"OrderDelete error 4108" Неверный номер тикета

а это вообще не пойму что такое, реквоты в тестере???

"OrderSend error 138" Новые цены



Рыночные ордера и не должны удаляться, их можно закрыть (OrderClose).

 ticket = OrderSend (Symbol(), OP_SELL, NewLot, OpenPriceSell, Slipagge, 0, 0, "0", magic, 0, Red );


Это тоже неправильно - рыночный ордер (OP_BUY и OP_SELL) должен открываться по текущей цене (Ask или Bid).
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


А как правильно записать открытие ордера по рынку на отступ Х от цены открытия свечи?


А зачем по рынку? Чем не устраивают BUY_STOP и SELL_STOP?
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, уважаемые! Из-за нехватки времени нет возможности торговать в течение дня, вот и решила написать сову, а тут и видео уроки в тему. Сделала, ошибок нет, но ордера не открываются. Делала на основе индюка ForexTrend. Суть в том, чтобы ордера buy открывались, когда синяя линия выше красной больше, чем на 10 пунктов, а закрывались, когда меньше 10. Ордер sell открывается при тех же условиях, только когда выше красная линия индикатора. SL=TP и не закладываются в пунктах (только не знаю, как это написать). Может, подскажет кто, что изменить? Буду очень благодарна. Индюк и сову прилагаю.

111.mq4
ForexTrend~.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)



А как правильно записать открытие ордера по рынку на отступ Х от цены открытия свечи?


А зачем по рынку? Чем не устраивают BUY_STOP и SELL_STOP?


Для понимания механизма MQL4, как то так :) и для борьбы с проскальзываниями наверное... Изменено пользователем Semarql
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)


Для понимания механизма MQL4, как то так :) и для борьбы с проскальзываниями наверное...



Нужно что-то типа виртуальных BUY_STOP и SELL_STOP?
И чтобы они могли скользнуть только на величину указанную в Slippage?

Цитата

При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки).



Т.е., чтобы использовать команду OrderSend, нужно чтобы цена (пришедшая с текущим тиком) совпала с нашей расчётной (+- некоторое значение).

Спойлер

//-----------------------------------+

if (MathAbs(OpenPriceSell - Bid)/Point) ticket = OrderSend (Symbol(), OP_SELL, NewLot, Bid, Slipagge, 0, 0, "0", magic, 0, Red );

//-----------------------------------+

if (MathAbs(OpenPriceSell - Ask)/Point) ticket = OrderSend (Symbol(), OP_BUY, NewLot, Ask, Slipagge, 0, 0, "0", magic, 0, Blue );
//-----------------------------------+



Теперь наши ордера стали одновременно и стоповыми и лимитными... :-b
Abs, во внешние переменные - это и есть то "некоторое значение" в пунктах, которыми мы готовы пожертвовать. Для тестера нужно ставить побольше.
Еще, желательно проверить, не находится-ли уже цена выше бая, или ниже села... и решить, надо-ли в этом случае ставить ордера...


Добавлено: 04-10-2013 21:36:58


Сделала, ошибок нет, но ордера не открываются.



Компилятор не покажет ни математические ошибки, ни логические.
Первое, что увидел:
extern string TimeFrame = "current time frame";
PriceHigh = iCustom (Symbol(), 0, "ForexTrend~", TimeFrame, SSP, Kmin, Kmax, CountBars, 0, 0);

Если Вам нужен текущий тайм, ставьте 0 и всё:
PriceHigh = iCustom (Symbol(), 0, "ForexTrend~", 0, SSP, Kmin, Kmax, CountBars, 0, 0);
В справке по iCustom это есть.

Цитата

SL=TP и не закладываются в пунктах (только не знаю, как это написать).


Это я не понял.

Спойлер

SL = NormalizeDouble(Bid TP = NormalizeDouble(Bid
ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket > 0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}



Там, где SL и TP, должны быть условия, по которым открывается сделка.
Например: if ((PriceHigh - PriceLow)/Point >= 10)

А посчитать SL и TP, лучше уже после открытия ордера, перед OrderModify(). И считать относительно OrderOpenPrice().
Например: SL = NormalizeDouble(OrderOpenPrice() - StopLoss*Point, Digits); Изменено пользователем Vorchunozavr
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано (изменено)
Цитата

Нужно что-то типа виртуальных BUY_STOP и SELL_STOP?



Ага, а вообще хочется реализовать такую вещь в советнике

_http://www.mql5.com/ru/market/product/380#full_description Изменено пользователем Semarql
Ссылка на сообщение
Поделиться на другие сайты

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

Ув. Vorchunozavr, спасибо, первую поправку учла, а дальше просто темный лес! По моей задумке нет фиксированных (в пунктах) SL и TP. Хочется сделать так, чтобы ордера BUY открывались, когда синяя линия индикатора, пересекая красную линию снизу вверх, отдаляется от нее на 10 и более пп. Закрывается же ордер, когда линии сближаются до 10 пп. С ордером SELL та же ситуация, только красная линия вверху. Не знаю, как это прописать. Это моя первая попытка написания советника, опыта ноль. Буду благодарна за любую помощь.

Ссылка на сообщение
Поделиться на другие сайты

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


Ув. Vorchunozavr, спасибо, первую поправку учла, а дальше просто темный лес! По моей задумке нет фиксированных (в пунктах) SL и TP. Хочется сделать так, чтобы ордера BUY открывались, когда синяя линия индикатора, пересекая красную линию снизу вверх, отдаляется от нее на 10 и более пп. Закрывается же ордер, когда линии сближаются до 10 пп. С ордером SELL та же ситуация, только красная линия вверху. Не знаю, как это прописать. Это моя первая попытка написания советника, опыта ноль. Буду благодарна за любую помощь.



На самом деле все просто...
Нужно всего-лишь сравнить цены:
1. Получить цену от линии индикатора
2. Получить текущую цену
3. Вычесть одну из другой и привести к пунктам (разделить на Point)
4. Сравнить результат с Вашими искомыми пунктами и выполнить нужное действие
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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



Ув. Vorchunozavr, спасибо, первую поправку учла, а дальше просто темный лес! По моей задумке нет фиксированных (в пунктах) SL и TP. Хочется сделать так, чтобы ордера BUY открывались, когда синяя линия индикатора, пересекая красную линию снизу вверх, отдаляется от нее на 10 и более пп. Закрывается же ордер, когда линии сближаются до 10 пп. С ордером SELL та же ситуация, только красная линия вверху. Не знаю, как это прописать. Это моя первая попытка написания советника, опыта ноль. Буду благодарна за любую помощь.



На самом деле все просто...
Нужно всего-лишь сравнить цены:
1. Получить цену от линии индикатора
2. Получить текущую цену
3. Вычесть одну из другой и привести к пунктам (разделить на Point)
4. Сравнить результат с Вашими искомыми пунктами и выполнить нужное действие


АААААААААА!!!!!!!!!!! Вынос мозга! В том то и проблема, что есть понимание, как говорится, "на пальцах", но нет понятия КАК это прописать. Представьте, что я первоклашка, а Вы профессор универа. То, что элементарно для Вас, для меня - высшая математика. Ломаю голову, переделываю, но все без толку. Посмотрите, пожалуйста, индюк и сову выкладывала на предыдущей странице.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


На самом деле все просто...
Нужно всего-лишь сравнить цены:
1. Получить цену от линии индикатора
2. Получить текущую цену
3. Вычесть одну из другой и привести к пунктам (разделить на Point)
4. Сравнить результат с Вашими искомыми пунктами и выполнить нужное действие



Там индикатор подвальный, немного по другому считать нужно.


АААААААААА!!!!!!!!!!! Вынос мозга! В том то и проблема, что есть понимание, как говорится, "на пальцах", но нет понятия КАК это прописать. Представьте, что я первоклашка, а Вы профессор универа. То, что элементарно для Вас, для меня - высшая математика. Ломаю голову, переделываю, но все без толку. Посмотрите, пожалуйста, индюк и сову выкладывала на предыдущей странице.



Посмотрите урок № 2 ещё пару раз.
xbms прав, там всё очень просто, как раз для первого класса :d
Код я написал, если совсем не будет получаться - выложу, дабы Вы голову не сломали :)

Ссылка на сообщение
Поделиться на другие сайты

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



На самом деле все просто...
Нужно всего-лишь сравнить цены:
1. Получить цену от линии индикатора
2. Получить текущую цену
3. Вычесть одну из другой и привести к пунктам (разделить на Point)
4. Сравнить результат с Вашими искомыми пунктами и выполнить нужное действие



Там индикатор подвальный, немного по другому считать нужно.


АААААААААА!!!!!!!!!!! Вынос мозга! В том то и проблема, что есть понимание, как говорится, "на пальцах", но нет понятия КАК это прописать. Представьте, что я первоклашка, а Вы профессор универа. То, что элементарно для Вас, для меня - высшая математика. Ломаю голову, переделываю, но все без толку. Посмотрите, пожалуйста, индюк и сову выкладывала на предыдущей странице.



Посмотрите урок № 2 ещё пару раз.
xbms прав, там всё очень просто, как раз для первого класса :d
Код я написал, если совсем не будет получаться - выложу, дабы Вы голову не сломали :)



1. А что значит "подвальный"?
2. Сейчас и сяду пересматривать, хотя... такое ощущение, что у меня уже шарики за ролики заехали, посмотрим.
Ссылка на сообщение
Поделиться на другие сайты

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


1. А что значит "подвальный"?
2. Сейчас и сяду пересматривать, хотя... такое ощущение, что у меня уже шарики за ролики заехали, посмотрим.



1. Индикатор не на графике цены, а в отдельном окне.
2. Техзадание - есть:
Цитата

Хочется сделать так, чтобы ордера BUY открывались, когда синяя линия индикатора, пересекая красную линию снизу вверх, отдаляется от нее на 10 и более пп. Закрывается же ордер, когда линии сближаются до 10 пп. С ордером SELL та же ситуация, только красная линия вверху.



ТП и СЛ не нужны, дык зачем Вы их пишете в советник? Убираем.
Лучше называть переменные понятными именами. Какие, нафиг, "PriceHigh" и "PriceLow"? Если мы решили работать с линиями, так и пишем BlueLine и RedLine.
Ордер нужно открыть (по условию) и закрыть (по условию), значит OrderSend() и OrderClose(). Никаких OrderModify(), тикетов и т.п.

Значения индикатора на еновых парах сильно отличаются от обычных пар, так что универсальность советника потребует его усложнения...

Ссылка на сообщение
Поделиться на другие сайты

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



1. А что значит "подвальный"?
2. Сейчас и сяду пересматривать, хотя... такое ощущение, что у меня уже шарики за ролики заехали, посмотрим.



1. Индикатор не на графике цены, а в отдельном окне.
2. Техзадание - есть:
Цитата

Хочется сделать так, чтобы ордера BUY открывались, когда синяя линия индикатора, пересекая красную линию снизу вверх, отдаляется от нее на 10 и более пп. Закрывается же ордер, когда линии сближаются до 10 пп. С ордером SELL та же ситуация, только красная линия вверху.



ТП и СЛ не нужны, дык зачем Вы их пишете в советник? Убираем.
Лучше называть переменные понятными именами. Какие, нафиг, "PriceHigh" и "PriceLow"? Если мы решили работать с линиями, так и пишем BlueLine и RedLine.
Ордер нужно открыть (по условию) и закрыть (по условию), значит OrderSend() и OrderClose(). Никаких OrderModify(), тикетов и т.п.

Значения индикатора на еновых парах сильно отличаются от обычных пар, так что универсальность советника потребует его усложнения...



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

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...