Уроки по программированию на языке MQL4 от eevviill

  • Автор темы Автор темы eevviill
  • Дата начала Дата начала

Bill Vill

Новичок форума
А вот теперь то отлично с этим паролем пошло все qwe2011qwe ,тот который мне был дан в личку он не подходил.
 

Bill Vill

Новичок форума
Скрипт

Точно так.
#property copyright ""
#property show_inputs
extern int Magic = 0;
int start()
{
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if(OrderMagicNumber()== Magic)
if (OrderType()==OP_BUYLIMIT ) OrderDelete(OrderTicket());
}
return(0);
}

P.S. Больше отвечать на вопросы которые были в прошлых уроках не буду.

Все в порядке работать будет)))Вам спасибо) А всего то было в дело в этом ; и у меня компил- компиляторович ругаться перестал))Теперь нет никаких предупреждений все класс)))Вам спасибо))
 
Последнее редактирование:

4er58

Почетный гражданин
Хорошая тема автору благодарность , только сейач увидел эту тему , не торопитесь подождите плиз , меня , 5 страниц надо всего ничего освоить )...
 

eevviill

Заблокирован
Урок 8 - цикл for(;;;) и цикл while()

Сегодня мы познакомимся с операторами цыклов.

Оператор for(;;;)
{}
Покажу на простейшем примере. Я понимаю как работает этот оператор, но мне не удобно его применять. Если у вас будут по нему вопросы, то будем вместе разбиратся.
Пример будет такой. Надо посчитать суму чисел от 6 до 17(6+7+8...).

Выглядеть это будет так.


PHP:
Expand Collapse Copy
1)int a=6,b=17,i,Suma;
 
int start()
{
2)for(i=a;b>=i;i++)
{
Suma=Suma+i;
}
 
3)Alert(Suma);
Return(0);
}

Пояснение.
1)Ещё один способ объявления переменных. Можно одной строкой через запятую(если они одного типа). При этом можно сразу присваивать им значение.
2)Оператор for. После него в скобках должны быть 3 условия, после них должны указыватся наши действия в рамках оператора(в квадратных скобках). Итак.
2.1)В первом условии записывается с чего начинаем(с числа 6).
2.2)Во втором условии пишется когда наш оператор закончит свою работу.
2.3)В третем условии записывается шаг(в нашем случае), на который менять значение переменной i.

Цикл проходит в таком порядке. Первое условие-второе условие-тело(в квадратных скобках)-третье условие.

Объясню на нашем примере что делается.
1-ый круг.
2.4)Оператор получил первое условие, это число 6.
2.5)Оператор проверил или 17 больше(или ровно) 6. Если да то продолжаем, если нет оператор for отключается и передаёт управление следуещему оператору.
2.6)Дальше оператор передаёт значение 1-го условия и пересчитывает то, что в теле. У нас стоит Suma=Suma+i; Перед первым кругом значение переменной Suma не было присвоенно. Значит 0. Подсчитываем. Suma=0+6=6.
2.7)В третьем условии стоит что нам надо i увеличить на единицу(i++).
2-ой круг.
2.8)Оператор получил новое условие, это число 7 (так как в конце прошлого круга мы увеличили i на еденицу).
2.9)Оператор проверил или 17 больше(или ровно) 7. Если да то продолжаем, если нет оператор for отключается и передаёт управление следуещему оператору.
2.10)Дальше оператор передаёт значение 1-го условия и пересчитывает то, что в теле. У нас стоит Suma=Suma+i; После первого круга значение переменной Suma = 6. Подсчитываем. Suma=6+7=13.
2.11)В третьем условии стоит что нам надо i увеличить на единицу(i++).
И т.д.
3)После выхода из цыкла(когда 2ое условие стаёт false) for, мы выведем на экран результат.

Оператор while()
{}
Пояснение.
Этот оператор будет исполнятся пока условие в скобках будет истинным(true). Как только условие станет ложным, оператор закончит свою роботу, и будет выполнятся следующий за ним оператор.
 
Последнее редактирование модератором:

eevviill

Заблокирован
Урок 9 - скрипт закрывающий ордера

Добрый день. Сегодня мы сделаем скрипт котрый будет закрывать ордера.

Скрипт.

PHP:
Expand Collapse Copy
#property copyright "eevviill"
#property show_inputs
extern string TO = "Тип ордера для закрытия";
extern bool Buy = false;
extern bool Sell = false;
extern bool BuyStop = false;
extern bool SellStop = false;
extern bool BuyLimit = false;
extern bool SellLimit = false;
extern bool Close_all_lots = true;
extern double Close_lot = 0.1;
double Lot;
extern int Magic = 0;
extern int Slippage = 4;
 

int start()
  {
1)if(Close_all_lots==true) Lot=OrderLots();
if(Close_all_lots==false) Lot=Close_lot;
  
2)for (int i=OrdersTotal()-1; i>=0; i--)
{
3)if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_BUY && Buy==true) OrderClose(OrderTicket(),Lot,Bid,Slippage,Yellow);
if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_SELL && Sell==true) OrderClose(OrderTicket(),Lot,Ask,Slippage,Yellow);
if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_BUYSTOP && BuyStop==true) OrderDelete(OrderTicket());
if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_SELLSTOP && SellStop==true) OrderDelete(OrderTicket());
if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_BUYLIMIT && BuyLimit==true) OrderDelete(OrderTicket());
if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()== Magic && OrderType()==OP_SELLLIMIT && SellLimit==true) OrderDelete(OrderTicket());
}
   return(0);
  }

Пояснение.
1)Здесь мы выбираем какую часть лота ордера нужно закрыть. Если во внешних переменных Close_all_lots = true, то будет закрыватся весь ордер. Если Close_all_lots = false , то будет закрыватся та часть лотов что укажыте в переменной Close_lot.
2)С помощью функции for мы перебираем ордера с конца. Как мы помним, этот цикл имеет 4 шага.
2.1)Мы присвоили переменной i значение TotalOrders()-1. Это значит что мы начинаем перебирать ордера начиная с передпоследнего.
2.2)Проверили есть ли у нас ещё открытые ордера.
2.3)Выполняется то, что в теле функции.
2.4)Переменную i уменьшили на еденицу.
3)Здесь мы перечисляем условия для закрытия ордера бай. А именно.
3.1)OrderSelect(i,SELECT_BY_POS) мы выбрали ордер для работы с ним с порядковым номером і.
3.2)OrderMagicNumber()== Magic Меджик должен совпадать с меджиком закрываемого ордера. Если меджик=0, то это ордера открыты вручную.
3.3)OrderType()==OP_BUY Проверяем тип выбраного ордера.
3.4)Buy==true Во внешних переменных мы указываем какой тип ордеров закрывать.
 

Вложения

Последнее редактирование модератором:

chocolate

Гуру форума
eevviill, а давайте мы ссылки на все уроки в первое сообщение добавим. Пишите в личку текст. Я добавлю.
 

eevviill

Заблокирован
Урок 10 - трейлинг стоп

Сегодня будем учится применять трейлинг стоп. Может кто не знает, то это подтягивание СЛ после определённого количества пунктов в+.

Трейлинг стоп.
PHP:
Expand Collapse Copy
int TrailingStop = 10;
 
1)OrderSelect(0,SELECT_BY_POS);
2)if(OrderMagicNumber()==Magic) 
 {
3)if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>TrailingStop*Point && OrderStopLoss()<Bid-TrailingStop*Point) OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>TrailingStop*Point && OrderStopLoss()>Ask+TrailingStop*Point) OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Blue);
 }
4)OrderModify();

Пояснение.
1)Для начала выбираем ордер с которым будем работать.
2)Проверяем ордер на меджик.
3)Здесь указываем условие трейлинга для ордера бай.
3.1)OrderType()==OP_BUY проверяем тип открытого ордера.
3.2)Bid-OrderOpenPrice()>TrailingStop*Point текущая цена-цена открытия ордера>количество пунктов трейлинга.
3.3)OrderStopLoss()<Bid-TrailingStop*Point стоп лос ордера<текущая цена-количество пунктов трейлинга.
4)OrderModify(); функция модификации ордера(СЛ,ТП,цена отложенного ордера).
 
Последнее редактирование модератором:

chocolate

Гуру форума
Ну мало ли, вдруг Вы захотите какой-то текст добавить или описание небольшое к урокам.

Некоторые так по 5-10 раз просят менять описание к своей ветке.

Обновил первое сообщение. Думаю раз в 5 уроков можно обновлять.
 

eevviill

Заблокирован
Урок 11 - пользовательская функция

Добрый день. Сегодня будем разсматривать пользовательскую функцию.
Что это? Грубо говоря это блок каких то расчётов, корые находятся вне функции Start() но вызываются ею.
Будем разсматривать 2 примера. Пример обчисления 3 чисел и пример нахождения цены выше или ниже МА. В этих примерах не будет функции типа Void(). Отличается только тем что не возвращает никаких значений.


Пример1.
PHP:
Expand Collapse Copy
int a=3;
int b=8;
int c=6;
int d;
 
int start()
{
1)d=Summa(a,b,c);
return;
}
 
2)int Summa(int a,int b,int c)
{
3)int g=a+b+c;
4)return(g);
}
Пояснение1.
1)Здесь мы присваиваем переменной d, то что вернёт нам функция. При этом надо писать так как в 2) только без типов данных.
2)Это собственно название функции и входные параметры. ОБЯЗАТЕЛЬНО надо указывать тип данных нашей функции(то что будет возвращать) и тип входных данных(даже если до этого тип был указан).
3)Это тело функции. Здесь проводятся все расчёты.
4)Это то значение которое мы вернём и присвоим переменной d.



Пример2.
Желательно в входные параметры записывать чем по меньше значений. Тоесть если есть возможность, то проводить расчёты (которые ведутся в функции start()) в самой пользовательской функции.


PHP:
Expand Collapse Copy
extern int period_MA=60; 
int a;

int start()
{
1)a=Price_MA(period_MA);
2)if(a>0) OrderSend(Symbol(),OP_BUY,0.1,Ask,2,0,0,"user function",54,0,CLR_NONE);
return;
}

3)int Price_MA(int period_MA)
{
 4)double MA1 = iMA(Symbol(), 0, period_MA,0 ,MODE_LWMA, PRICE_CLOSE, 1);
 
 {
 5)if(Close[1]<MA1) return(-1); 
 if(Close[1]>MA1) return (1);
 }
 
 6)return(0);
}
Пояснение2.
1)Мы присвоили переменной a значение, которое будет передано после обчисления функции Price_MA(period_MA). Записывать надо
1.1)Название без типа данных.
1.2)В скобках входные данные без типа данных.
2)Здесь мы указали условие что если после присвоения переменной a значение и если оно будет больше нуля, то открываем ордер.
3)Название функции и входные параметры. Записывается так.
3.1)Название пишется с указанием типа данных которое будет возвращатся.
3.2)Входные параметры пишутся с указанием типа данных.
4)Здесь прямо в функции присваиваем переменной МА1 значение индикатора МА. Единственным параметром который будет менятся в индикаторе МА это период МА. Он у нас находится во входных параметрах функции Price_MA.
5)Здесь мы указали что если цена находится ниже индикатора МА, то функция Price_MA при её вызове вернёт -1. Если выше то 1.
6)Если ни одно из указаных условий не верно(в нашем случае такого быть не может. Значит ошибка где то), то при обращении к функции она вернёт 0.


Пояснение void.
Если тип функции такой, то при обращении к ней она ничего не возвращает. Тоесть происходят действия, котрые в теле функции и всё. В большинстве случаев это функции открытия, модификации, подсчёта, закрытия ордеров.
 
Последнее редактирование модератором:

eevviill

Заблокирован
Урок 12 - индикатор

Добрый день. Сегодня будем писать индикатор. Он будет написан на основе индикатора ATR и будет показывать волатильность на всём рынке на выбраном ТФ.

Индикатор.
PHP:
Expand Collapse Copy
#property copyright "eevviill"
#property link      "[email protected]"
1)#property indicator_chart_window
 
extern int TF_ATR = 5;
string TF_ATR3; 
int TF_ATR2;
2)int deinit()
{
ObjectDelete("Name ATR TF");
ObjectDelete("TF ATR");
ObjectDelete("ATR");
ObjectDelete("ATR Value");
return;
}
 
int start()
  {
3)int    counted_bars = IndicatorCounted();
 
4)switch(TF_ATR)
{
case 1 : TF_ATR2 = PERIOD_M1; break;
case 5 : TF_ATR2 = PERIOD_M5; break;
case 15 : TF_ATR2 = PERIOD_M15; break;
case 30 : TF_ATR2 = PERIOD_M30; break;
case 60 : TF_ATR2 = PERIOD_H1; break;
case 240 : TF_ATR2 = PERIOD_H4; break;
case 1440 : TF_ATR2 = PERIOD_D1; break;
}
 
5)double ATR_EURUSD = iATR("EURUSD",TF_ATR2,14,1);
double ATR_EURJPY = (iATR("EURJPY",TF_ATR2,14,1))/100;
double ATR_EURGBP = iATR("EURGBP",TF_ATR2,14,1);
double ATR_EURCHF = iATR("EURCHF",TF_ATR2,14,1);
double ATR_EURCAD = iATR("EURCAD",TF_ATR2,14,1);
double ATR_EURAUD = iATR("EURAUD",TF_ATR2,14,1);
double ATR_EURNZD = iATR("EURNZD",TF_ATR2,14,1);
double ATR_GBPUSD = iATR("GBPUSD",TF_ATR2,14,1);
double ATR_GBPJPY = (iATR("GBPJPY",TF_ATR2,14,1))/100;
double ATR_GBPCHF = iATR("GBPCHF",TF_ATR2,14,1);
double ATR_GBPCAD = iATR("GBPCAD",TF_ATR2,14,1);
double ATR_GBPAUD = iATR("GBPAUD",TF_ATR2,14,1);
double ATR_GBPNZD = iATR("GBPNZD",TF_ATR2,14,1);
double ATR_AUDUSD = iATR("AUDUSD",TF_ATR2,14,1);
double ATR_AUDJPY = (iATR("AUDJPY",TF_ATR2,14,1))/100;
double ATR_AUDCHF = iATR("AUDCHF",TF_ATR2,14,1);
double ATR_AUDCAD = iATR("AUDCAD",TF_ATR2,14,1);
double ATR_AUDNZD = iATR("AUDNZD",TF_ATR2,14,1);
double ATR_NZDUSD = iATR("NZDUSD",TF_ATR2,14,1);
double ATR_NZDJPY = (iATR("NZDJPY",TF_ATR2,14,1))/100;
double ATR_NZDCHF = iATR("NZDCHF",TF_ATR2,14,1);
double ATR_NZDCAD = iATR("NZDCAD",TF_ATR2,14,1);
double ATR_USDJPY = (iATR("USDJPY",TF_ATR2,14,1))/100;
double ATR_USDCHF = iATR("USDCHF",TF_ATR2,14,1);
double ATR_USDCAD = iATR("USDCAD",TF_ATR2,14,1);
double ATR_CADCHF = iATR("CADCHF",TF_ATR2,14,1);
double ATR_CADJPY = (iATR("CADJPY",TF_ATR2,14,1))/100;
double ATR_CHFJPY = (iATR("CHFJPY",TF_ATR2,14,1))/100;
6)double ATR_all = (ATR_EURUSD+ATR_EURJPY+ATR_EURGBP+ATR_EURCHF+ATR_EURCAD+ATR_EURAUD+ATR_EURNZD+
ATR_GBPUSD+ATR_GBPJPY+ATR_GBPCHF+ATR_GBPCAD+ATR_GBPAUD+ATR_GBPNZD+
ATR_AUDUSD+ATR_AUDJPY+ATR_AUDCHF+ATR_AUDCAD+ATR_AUDNZD+
ATR_NZDUSD+ATR_NZDJPY+ATR_NZDCHF+ATR_NZDCAD+
ATR_USDJPY+ATR_USDCHF+ATR_USDCAD+
ATR_CADCHF+ATR_CADJPY+
ATR_CHFJPY)/28;
7)string ATR = DoubleToStr(ATR_all,6);
 
8)ObjectCreate("Name ATR TF",OBJ_LABEL,0,0,0);
ObjectSet("Name ATR TF",OBJPROP_CORNER,1);
ObjectSet("Name ATR TF", OBJPROP_XDISTANCE,80);
ObjectSet("Name ATR TF", OBJPROP_YDISTANCE, 34);
ObjectSetText("Name ATR TF","Overall ATR TF =",12,"Arrial",Yellow);
9)switch(TF_ATR)
{
case 1 : TF_ATR3 = "M1"; break;
case 5 : TF_ATR3 = "M5"; break;
case 15 : TF_ATR3 = "M15"; break;
case 30 : TF_ATR3 = "M30"; break;
case 60 : TF_ATR3 = "H1"; break;
case 240 : TF_ATR3 = "H4"; break;
case 1440 : TF_ATR3 = "D1"; break;
}
ObjectCreate("TF ATR",OBJ_LABEL,0,0,0);
ObjectSet("TF ATR",OBJPROP_CORNER,1);
ObjectSet("TF ATR", OBJPROP_XDISTANCE,42);
ObjectSet("TF ATR", OBJPROP_YDISTANCE, 30);
ObjectSetText("TF ATR",TF_ATR3,15,"Arrial",OrangeRed);
ObjectCreate("ATR",OBJ_LABEL,0,0,0);
ObjectSet("ATR",OBJPROP_CORNER,1);
ObjectSet("ATR", OBJPROP_XDISTANCE,110);
ObjectSet("ATR", OBJPROP_YDISTANCE, 58);
ObjectSetText("ATR","Overall ATR =",12,"Arrial",Yellow);
ObjectCreate("ATR Value",OBJ_LABEL,0,0,0);
ObjectSet("ATR Value",OBJPROP_CORNER,1);
ObjectSet("ATR Value", OBJPROP_XDISTANCE,22);
ObjectSet("ATR Value", OBJPROP_YDISTANCE, 54);
ObjectSetText("ATR Value",ATR,15,"Arrial",DeepSkyBlue);
   return(0);
  }
Пояснение.
1)Здесь указывается где будет наш индикатор(в нашем случае в основном графике). Если в отдельном окне, то надо писать #indicator_separate_window
2)Как мы помним эта функция используется при удаления файла с графика. В нашем случае при удалении индикатора с графика будут удалены объекты с названиями указаные в скобках. Если надо удалять все объекты с графика то надо писать ObjectsDeleteAll();
3)Это стандартная вставка генератора файлов MetaEditor. Показывает количество подсчитаных свечей. Вообще нужная вещь, но у нас использоватся не будет.
4)Ето оператор. Его задача примерно такая. Если значение переменной такое, то делаем то. По нашему примеру. Так как нам надо в индикатор записывать период, а он обозначается на просто цифрой, то надо писать что то типа если ТФ АТР = 5 , значит присваиваем другой переменной ТФ АТР2(которая записана у нах в свойствах индикатора) PERIOD_M5.
4.1)switch() здесь указывается назавание оператора, а в скобках записывается название переменной, значение которой мы будем перебирать.
4.2){} начало и конец оператора.
4.3)case : ;brake; здесь записывается значение переменной-потом 2 вертикальные точки-потом что делать-потом brake(значит что мы передаём управление дальше).
5)Здесь мы присваивали переменным значения индикатора ATR.
6)Здесь мы подсчитываем среднее значение ATR.
7)Здесь мы присваиваем string переменной значение типа double(ну и делаем так чтобы показывалось 6 цифр после запятой). Делается это потому что при создании надписи на графике тип надписи должен быть string.
8)Собственно это и есть создание и форматирование надписи на графике. В нашем примере это надпись Overall ATR TF =
8.1)ObjectCreate("Name ATR TF",OBJ_LABEL,0,0,0);
Этой функцией мы создаём что то. Параметры(название объекта,что мы создаём( у нас надпись),номер окна где создаём(0 это главный график), дальше идут координаты цены и времени(мы не используем)).
8.2)ObjectSet("Name ATR TF", OBJPROP_XDISTANCE,80);
Этой функцией мы форматируем созданый объект. Параметры(название форматируемого объекта,OBJPROP это обязательно и через _ пишем что мы хотим поменять(у нас растояние от правого края в пикселях справа на лево),величина 2-го параметра).
8.3)ObjectSetText("Name ATR TF","Overall ATR TF =",12,"Arrial",Yellow);
Если у нас объект текст, то мы можем его отформатировать. Параметры(название форматируемого объекта, текст который будет выводится на график, размер шрифта, стиль шрифта, цвет шрифта).
9)Здесь также как в пункте 7 надо данные перевести с одного типа(int) в string для отображения на графике.
 

Вложения

  • Market volatility.jpg
    Market volatility.jpg
    53,2 КБ · Просмотры: 327
  • Market volatility.mq4
    Market volatility.mq4
    3,7 КБ · Просмотры: 75
Последнее редактирование модератором:

eevviill

Заблокирован
chocolate а можно во всех сообщениях с уроками сделать как в 12 уроке?
(php)
 

eevviill

Заблокирован
Урок 13 - функция iCustom

Добрый день. Сегодня будем разбирать функцию iCustom.
Эта функция предназначена для получения данных с пользовательського индикатора.
Наш пример будет основыватся на советнике который берёт данные с индикатора sidus v.2. Он рисует на графике стрелки где покупать, а где продавать.


Советник.
PHP:
Expand Collapse Copy
#property copyright "eevviill"
#property link      "[email protected]"

extern double Lot = 0.1;
extern int Stop_Loss = 24;
extern int Take_Profit = 21;
extern int magic = 7352;
extern int Slippage = 2;

1)extern string Indicator = "sidus v.2";
extern int FastEMA = 16;
extern int SlowEMA = 24;

int start()
  {
while(!IsTradeAllowed()) Sleep(2000);
if(Volume[0]>1) return;
  
2)double arrow_up = iCustom(Symbol(),0,"sidus v.2",FastEMA,SlowEMA,3,1); //1
double arrow_down = iCustom(Symbol(),0,"sidus v.2",FastEMA,SlowEMA,4,1); //2

double SLbuy=0, SLsell=0,TPbuy=0,TPsell=0; 
if(Stop_Loss>0) {SLbuy=Ask-Stop_Loss*Point; SLsell=Bid+Stop_Loss*Point;}
if(Take_Profit>0) {TPbuy=Ask+Take_Profit*Point;TPsell=Bid-Take_Profit*Point;}

if(OrdersTotal()<1)
{
3)if(arrow_up>0) OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SLbuy,TPbuy,"Sidus v2",0,Green);
if(arrow_down>0) OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SLsell,TPsell,"Sidus v2",0,Red);
}

   return(0);
  }


Пояснение.
1)Здесь мы указываем те настройки индикатора, которые хотим менять с помощю советника. ОБЯЗАТЕЛЬНО! настройки должны совпадать:
1.1)С порядком настроек в индикаторе. Это можно посмотреть при прикреплении индикатора к графику.
1.2)С типом данных настроек которые в индикаторе. Например в нашем случае это периоды МА. А это тип данных int.
2)Здесь мы присваиваем переменной arrow_up значение индикатора. ОБЯЗАТЕЛЬНО! тип данных будет double, чтобы не передавал индикатор. Свойства.
2.1)Валютная пара с которой брать данные.
2.2)Тайм фрейм с которого брать данные.
2.3)Название индикатора в скобках без разширения.
2.4)Параметры которые мы хотим менять с помощю советника. Порядок обязателен.
2.5)Здесь мы указываем из какого буфера брать данные. Чтобы узнать какой нам буфер нужен, нужно зайти в свойства индикатора (при прикрепление к графику). Там в вкладке Цвета и будут наши буферы. Нумерация начинается с 0 до 7.
В нашем примере если мы сначала прикрепим индикатор к графику, а потом зайдём в свойства, то увидем что 3 буфер зелёного цвета и отвечает за стрелку вверх, а 4 красного цвета и отвечает за стрелку вниз.
2.6)С какой свечи брать данные.(0=текущая, 1=прошлая, 2=позапрошлая и т.д.)
3)Условие на покупку. Мы указали что если значение arrow_up больше 0 то бай.
Почему именно так???
Тут надо проводить опыт.
3.1)После функции iCustom где нибудь в конце пишем строчку
Alert(arrow_up," ",arrow_down). Это делается для того чтобы узнать что(какое значение) нам возвращает индикатор.
3.2)Заходим в тестер. Запускаем советник с визуализацией. После окончания тестирования заходим в вкладку журнал тестера и смотрим что там нам Алерт писал.
3.3)Итак. Когда стрелок нет Алерт выдаёт (0 0). Вывод (0-стрелки вверх нету 0-стрелки вниз нету).
Если (1.2345 0). Вывод. Ага! Если появилась стрелка вверх, то индикатор возвпащает цену где появилась. Ну и наоборот.
Конечный итог. 0=нету сигнала. >0 есть сигнал.
 

Вложения

eevviill

Заблокирован
У меня пока нет тем для уроков. Если у кого то появлятся темы с которыми надо разобратся, пишите.

Итак за 13 уроков мы научились писать простой индикатор, скрипты и советники. Думаю не плохо. Надеюсь эти знания помогут вам в торговли


P.S. Если кто то хочет материально отблагодарить Z262474651203
 

eevviill

Заблокирован
ОК. Если ни у кого нет вопросов по уроках, то жду предложение тем для уроков.
 

eevviill

Заблокирован
Пользовательские функции были. Логично было бы перейти к библиотекам функций.
А так же использование внешних dll библиотек. Хотя бы тех которые есть у всех. Например виндовая Kernel32.dll
Так же полезным может оказаться работа с файлами. Встроенными средствами, или с помощью той же Kernel32.dll

Или это слишком круто?
Слишком.
Тем более что сюда уже никто не заходит. Не знаю почему. Или нет времени или не интересно...
 

alyska

Элитный участник
Слишком.
Тем более что сюда уже никто не заходит. Не знаю почему. Или нет времени или не интересно...

тема хорошая забрасывать не нужно
вот только информации очень много нужно переварить подумать
 

TTUUPPOO

Почетный гражданин
Слишком.
Тем более что сюда уже никто не заходит. Не знаю почему. Или нет времени или не интересно...

:confused: уроки не бросай!!!
Взялся за гуж, не говори, что не дюж!!!

я к примеру тему только что увидел (
эта же ветка многие другие переживет и всегда актуальна будет...
и это не значит что весь форум должен сегодня же ее посетить...
неужели цифры Ответов-Просмотров важнее того что здесь?

Требуем продолжения банкета! пжл!
...а я пойду начну с самого первого, надо нагонять :?:

спасибо
 
Верх