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

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

#301

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


уважаемые форумчане. написал эксперт на основе внешнего индикатора... на валютных парах работает, а на золоте или нефти выдает 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);
}

Изменено 1 октября, 2013 пользователем Vorchunozavr

#302

В целях закрепления материала на внешнем индюке, взял внешний индюк на пересечение стохастика, если буфер 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 );

#303

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

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

#304


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

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


Спойлер

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

Изменено 1 октября, 2013 пользователем Vorchunozavr

#305

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

#306



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

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


Спойлер

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



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

Пробую оптимизировать, как в учебнике
#307
v
Будет работать и Ваше и моё, просто я более наглядно нарисовал...


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


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

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

#309

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

test2_dz.mq422 скач.
test2_dz.ex412 скач.
test3_dz2.ex419 скач.
test3_dz2.mq434 скач.

Автор#310

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

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

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


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


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



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

Цитата

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



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

Цитата

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



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

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

Тут Вы ставите лимитники, а я просил ставить стоп-ордера для страховки...

Изменено 3 октября, 2013 пользователем xbms

#311

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

"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" Новые цены


#312



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

"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).
#313

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

#314


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


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

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

111.mq423 скач.
ForexTrend~.mq425 скач.

#316



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


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


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

Изменено 4 октября, 2013 пользователем Semarql

#317


Для понимания механизма 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);

Изменено 5 октября, 2013 пользователем Vorchunozavr

#318
Цитата

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



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

_http://www.mql5.com/ru/market/product/380#full_description

Изменено 5 октября, 2013 пользователем Semarql

#319

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

Автор#320


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



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



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



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


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


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



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


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



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

#323



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



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


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



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



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


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



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

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



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

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

#325



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



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

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



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

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



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

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

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