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

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

Genadi22

Новичок форума
1) MathAbs(Close[1]-Open[1])/Point
2) (High[1]-Close[1])/Point (Close[1]-Low[1])/Point
3) (High[1]-Low[1])/Point это 100%

и выглядеть это будет так-

//====================
extern int S1 = 10; // длина тела
extern int S2 = 20; // длина стержня
extern double S3 = 0.25; // местоположение тела
//====================
int x1, x2, x3;
int S1 = Point;
int S2 = Point;
double S3 = Point;
int init()
{
x1 = MathAbs(Close[1]-Open[1])/S1;
x2 = MathAbs (High[1]-Close[1])/S2 " (Close[1]-Low[1])/S2;"
x3 = MathAbs (High[1]-Low[1])/S3; // это 100%
}
//====================
return(0);
}
//====================
во второй строчке параметр также вместе и пишется, или это отдельной строкой надо прописывать(выделил кавычками)

ещё про 100% - ясно, - но передвигатся будет по пунктам...
 
Последнее редактирование:

Genadi22

Новичок форума
у меня вопрос:
не возникнет ли противоречия второй строки

x2 = MathAbs (High[1]-Close[1])/S2 (Close[1]-Low[1])/S2;

с третьей

x3 = MathAbs (High[1]-Low[1])/S3; // это 100%

1) когда определено положение тела во второй строке,- и не будет ли проигнорирована в связи с этим третья строка…
2) не повлияет ли такое расхождение в расстоянии если – Close,- окажется ниже Open…
что приведёт к тому что программа к примеру в место одинаковых свечек - увидит нечто своё…
 

Вложения

  • 6.png
    6.png
    13,5 КБ · Просмотры: 25

eevviill

Заблокирован
у меня вопрос:
не возникнет ли противоречия второй строки

x2 = MathAbs (High[1]-Close[1])/S2 (Close[1]-Low[1])/S2;

с третьей

x3 = MathAbs (High[1]-Low[1])/S3; // это 100%

1) когда определено положение тела во второй строке,- и не будет ли проигнорирована в связи с этим третья строка…
2) не повлияет ли такое расхождение в расстоянии если – Close,- окажется ниже Open…
что приведёт к тому что программа к примеру в место одинаковых свечек - увидит нечто своё…
1) Нет.
2) Для того в х2 и 2 варианта
 

Genadi22

Новичок форума
1) Нет.
2) Для того в х2 и 2 варианта

получилась такая скомпилированная функция

//==============================
int S1 = 10, S2 = 20;
double S3 = 0.25, bar1;

void Bar1()
{
int x1, x2, x3,
S1 = Point;
S2 = Point;
double S3 = Point;

x1 = MathAbs (Close[1]-Open[1])/S1;
x2 = MathAbs (High[1]-Close[1])/S2+(Close[1]-Low[1])/S2;
x3 = MathAbs (High[1]-Low[1])/S3; // это 100%
//=============================
return(0);
}
//==============================

ошибок 0, предупреждений 0.
всё ли правильно...

хотя токо что заметил что - int x1, x2, x3, - нету точки с запятой...
и кроме этого без + во второй строке не компилировалось
 
Последнее редактирование:

eevviill

Заблокирован
получилась такая скомпилированная функция

//==============================
int S1 = 10, S2 = 20;
double S3 = 0.25, bar1;

void Bar1()
{
int x1, x2, x3,
S1 = Point;
S2 = Point;
double S3 = Point;

x1 = MathAbs (Close[1]-Open[1])/S1;
x2 = MathAbs (High[1]-Close[1])/S2+(Close[1]-Low[1])/S2;
x3 = MathAbs (High[1]-Low[1])/S3; // это 100%
//=============================
return(0);
}
//==============================

ошибок 0, предупреждений 0.
всё ли правильно...

хотя токо что заметил что - int x1, x2, x3, - нету точки с запятой...
и кроме этого без + во второй строке не компилировалось
Если ты такое написал как в х2 и это ты ищешь тень, то рекомендую ещё попрактиковатся.
 

Genadi22

Новичок форума
Если ты такое написал как в х2 и это ты ищешь тень, то рекомендую ещё попрактиковатся.


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

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

и, всё же, вместо плюса - как правильно...

x2 = MathAbs (High[1]-Close[1])/S2-(Close[1]-Low[1])/S2;

вот так тоже компилируется,- а без них пишет ошибку
 
Последнее редактирование:

Genadi22

Новичок форума
у меня вопрос…

конечный результат функции - Bar1() – x1, x2, x3;
теперь их надо обьединить

int bar1;
bar1 = bar1 + x1 + x2 + x3;

1) правильно ли обьединил
2) и куда это вписывать – в начало самой функции после – void, - или до
 
Последнее редактирование:

Genadi22

Новичок форума
в принципе уже финиш
шаблон для калибровки кода, - проверяется как обычный советник в тестере,- при определении свечи – выставляется вертикальная линия и ставится метка – так задумано,- но не работает…

eevviill – это больше моих способностей и возможности…
большая просьба доведи его до рабочего состояния…
 

Вложения

Dom

Гуру форума
Здравствуйте Все!! Наверное,мой вопрос,не по теме, извините если так. Куда пропал eevviill, или я что-то пропустил?
 

Genadi22

Новичок форума
Привет Всем и доброго здравия...

да действительно давненько eevviill не видно,- хотя у каждого есть дела и поважнее...

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

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

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

//***** метка на графике *****
void L_L (string LabelName, color col, datetime DTM, double Price, int S)
{
ObjectDelete(LabelName);
ObjectCreate(LabelName, OBJ_ARROW,0,DTM,Price);
ObjectSet (LabelName, OBJPROP_COLOR, col);
ObjectSet (LabelName, OBJPROP_WIDTH,S);
ObjectSet (LabelName, OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE);
}
//***** вертикальная линия *****
void v_l (string LineName, color col, datetime DT)
{
ObjectDelete(LineName);
ObjectCreate(LineName, OBJ_VLINE, 0, DT, 0);
ObjectSet (LineName, OBJPROP_COLOR, col);
ObjectSet (LineName, OBJPROP_STYLE, STYLE_DOT);
}
//==============================
int S1 = 10, S2 = 20, bar1;
double S3 = 0.25;

void Bar1()
{
int x1, x2, x3;
S1 = Point;
S2 = Point;
double S3 = Point;

x1 = MathAbs (Close[1]-Open[1])/S1;
x2 = MathAbs (High[1]-Close[1])/S2-(Close[1]-Low[1])/S2;
x3 = MathAbs (High[1]-Low[1])/S3;
bar1 = bar1 + x1 + x2 + x3;
//=============================
return(0);
}
//==============================

int start()
{
//double bar1;
Bar1();
if (bar1)
{
v_l(""+TimeToStr(Time[0], TIME_DATE|TIME_SECONDS), Green, Time[0]);
L_L(SYMBOL_RIGHTPRICE, Lime, Time[0], High[0], 1);
}
//==============================
return(0);
}
//==============================

всё что требуется, - это, что бы код определил - ОДНУ свечу с заранее установленными параметрами...

ну,- а, если нет - то хоть повеселимся -типа двоечники позор класса,- в моём лица,- в прочем как и всегда...
С Уважением ко Всем...
 

Genadi22

Новичок форума
всё что требуется, - это, что бы код определил - ОДНУ свечу с заранее установленными параметрами...

вариант 1:

Код:
int    S1 = 50,
       S2 = 150;
double S3 = 0.15;

bool Bar1()
{  
 int x1,x2;  
 double x3;    
 x1 = MathAbs (Close[1]-Open[1])/Point;   // Длинна тела  
 x2 = MathAbs (High[1]-Low[1])/Point-x1;  // Длинна теней  
 x3 = NormalizeDouble(x1/x2,1);               // отношение тела свечи к теням   
 Print("x1=",x1," x2=",x2, " x3=",x3);   
 if (x1>=S1 && x2>=S2 && x3>=S3) return(true);  // Если (тело >= S1) и (тени >= S2) и (тело/тени>= S3)    
 return(false);
}

int start()
{
  if (Bar1())
  {    
    v_l(""+TimeToStr(Time[1], TIME_DATE|TIME_SECONDS), Yellow, Time[1]);    
    L_L("LEFTPRACE", Lime, Time[1], Close[1], 1);  
  }

 return(0);
}

истины как и всегда -нет,- зато есть варианты...
Удачи...
 

viplert

Активный участник
Здравствуйте я ни так давно работаю с MQ4 и столкнулся с одной проблемой, точное закрытие и открытие сделок.

Есть функция при профить закрывает сделку, но работает она почему то коряво. Иногда закрывает сделки сразу при наступлении профита а иногда профит уходит и в 2 раза больше, а она ничего не делает, помогите разобраться почему?

Функция от KimIV:
Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
Закрытие одной предварительно выбранной позиции
 

_SERG_

Активный участник
Здравствуйте я ни так давно работаю с MQ4 и столкнулся с одной проблемой, точное закрытие и открытие сделок.

Есть функция при профить закрывает сделку, но работает она почему то коряво. Иногда закрывает сделки сразу при наступлении профита а иногда профит уходит и в 2 раза больше, а она ничего не делает, помогите разобраться почему?

Функция от KimIV:
Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
Закрытие одной предварительно выбранной позиции

Для предметного разговора, как бы не хватает самого предмета. Исходники приатачь.
 

Ugar

Гуру форума
Здравствуйте я ни так давно работаю с MQ4 и столкнулся с одной проблемой, точное закрытие и открытие сделок.

Есть функция при профить закрывает сделку, но работает она почему то коряво. Иногда закрывает сделки сразу при наступлении профита а иногда профит уходит и в 2 раза больше, а она ничего не делает, помогите разобраться почему?

Функция от KimIV:
Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
Закрытие одной предварительно выбранной позиции
Косяки в функциях бывают. Сам встречал таковые в функциях KimIV.
При отсутствии стандартов на написание функций, каждый пишет как в взбрендит. Вполне можно столкнуться с несовместимостью функций, даже у одного программиста, не говоря о применении функций разных программистов в одной программе.
По этому, не стоит применять чужие функции, не разобрав по косточкам её внутренности.
Для начинающего программиста, полезно для изучения языка, разобрать чужую функцию, понять что, как и зачем в ней работает.
Для опытных, если свою функцию писать лень, полезно разобраться в функции для проверка на чужие косяки.
 

matro3

Почетный гражданин
Здравствуйте я ни так давно работаю с MQ4 и столкнулся с одной проблемой, точное закрытие и открытие сделок.

Есть функция при профить закрывает сделку, но работает она почему то коряво. Иногда закрывает сделки сразу при наступлении профита а иногда профит уходит и в 2 раза больше, а она ничего не делает, помогите разобраться почему?

Функция от KimIV:
Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
Закрытие одной предварительно выбранной позиции

Вероятно Вы про это?
_http://forum.mql4.com/ru/38949/page2#434205

Может неверно вызывается функция?
ClosePosBySizeProfitInCurrency(Symbol(), -1, -1, 100)

Как это делаете Вы?
 

div15

Интересующийся
здравствуйте можно сделать урок про LotExponent
в случае убыточной сделки советник умножает лот на 2 то есть
0.01 0.02 0.04 0.08 итд. и от мани менеджмента
 

eevviill

Заблокирован
Урок 21 - увеличение лота, после убыточного ордера

PHP:
extern double Lot = 0.1;
extern bool use_martini_on_lose_order = false;
extern double Lose_to_on_martini = 0;
extern bool use_martini_on_SL = false;
extern double Lot_koef_closed = 2.2;
uchar nor_lot=2;

//////////////////////////////////////////////////////////////
int OnInit()
{  
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) nor_lot=1;
return(INIT_SUCCEEDED);
}

/////////////////////////////////////////////////////////////////
void OnTick()
{
1)double Lotss=Lot;
2)if(use_martini_on_lose_order) Lotss=chek_prev_order();
//OrderSend(...Lotss...)
}

/////////////////////////////////////////////////////////////
double chek_prev_order()
{
3)double lt=Lot;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
 {
   4)if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
   {
   if(OrderMagicNumber()==Magic)
   { 
   if(OrderSymbol()==Symbol())
   { 
   ////
   if(OrderType()==OP_SELL)
   {      
   5)if((!use_martini_on_SL && OrderProfit()+OrderSwap()+OrderCommission()<=-Lose_to_on_martini) || (use_martini_on_SL && OrderClosePrice()>=OrderStopLoss()))
   6)lt=OrderLots()*Lot_koef_closed;
   7)break;
   }
   /////
   if(OrderType()==OP_BUY)
   {      
   if((!use_martini_on_SL && OrderProfit()+OrderSwap()+OrderCommission()<=-Lose_to_on_martini) || (use_martini_on_SL && OrderClosePrice()<=OrderStopLoss()))
   lt=OrderLots()*Lot_koef_closed;
   )break;
   } 
   /////
   }
   }              
   }
 }
 
 8)return(NormalizeDouble(lt,nor_lot));
 }

1) Назначаем переменной Lotss стартовый лот.
2) Проверяем если у нас в настройках включен мартини на закрытый ордер, то заходим в функцию.
3) Назначаем переменной lt стартовый лот на случай если последний закрытый ордер был не убыточным.
4) Выбираем ордер с уже закрытых.
5) Выбрали сел и проверяем что у нас в настройках на счёт вкл/выкл мартини на закрытый ордер при срабатывании стоплоса или при убытке больше указаного. Если вкл при убытке больше указаного и убыток есть больше указаного в настройках уровня ИЛИ вкл при стоплосе и ордер был закрыт по стоплосу,
6)ТО переменной lt присваиваем Лот закрытого ордера*коеф указаный в настройках.
7) Останавливаем перебор ордеров как только попался ордер сел.
8) Возвращаем округленное значение лота после умножения.
 

سيرجي كيروف

Местный знаток
научите как сделать реверс в советнике
что прописать в код и что в настройки
 
Верх