Ваши вопросы по языку MQL4

eevviill

Заблокирован
вот нашел кусок кода на автомат 4 или 5 знаков котир,все вроде бы ясно и понятно, кроме строки prevtime = Time[0];
неясно что она делает, и надо ли переменную prevtime объявлять в начале кода?
дайте свои коменты и советы плиз, кто имеет опыт в коде MQL4, заранее СПАСИБО!
Я так перевожу.
PHP:
extern bool use_transform_4_dig = false; //перевод на 4-знак
double point;
void init()
{  
point=Point;
if(use_transform_4_dig && (Digits==3 || Digits==5))
point*=10;
}
 

hoz

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


По поводу типа согласен.. Хотя согласно приведению типов, int к string всё-равно приводится. Так что ошибки по ходу не будет.
А вот зачем её объявлять в старте? Не проще ли глобально? По-моему захламлять старт не самое лучшее решение...
 

hoz

Активный участник
вот нашел кусок кода на автомат 4 или 5 знаков котир,все вроде бы ясно и понятно, кроме строки prevtime = Time[0];
неясно что она делает, и надо ли переменную prevtime объявлять в начале кода?
дайте свои коменты и советы плиз, кто имеет опыт в коде MQL4, заранее СПАСИБО!

Это как-то криво написано. Я делаю проще и чётче:

В глобальных объявить:

PHP:
double pt;

В ИНИТЕ:

PHP:
   if (Digits == 2 || Digits == 4)
      pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
      pt = Point*10;
   if (Digits == 6)
      pt = Point*100;
   if (Digits == 7)
      pt = Point*1000;

В данном случает, не нужно, как принято, делить на поинт, чтоб найти истинное значение.
Рассчитывая значение, просто умножаешь на pt то или иное значение выражения и получаешь значение в пунктах! Мне так удобнее..
 

Milord

Местный знаток
Это как-то криво написано. Я делаю проще и чётче:

В глобальных объявить:

PHP:
double pt;

В ИНИТЕ:

PHP:
   if (Digits == 2 || Digits == 4)
      pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
      pt = Point*10;
   if (Digits == 6)
      pt = Point*100;
   if (Digits == 7)
      pt = Point*1000;

В данном случает, не нужно, как принято, делить на поинт, чтоб найти истинное значение.
Рассчитывая значение, просто умножаешь на pt то или иное значение выражения и получаешь значение в пунктах! Мне так удобнее..
хорошо, все понятно, спасибо! уточнить хотел, вернее не смог скрыть удивления от 6 и 7 знаковых котировок, это где такие если не секрет применяются???:not-good:
 

AlexeyVik

Программист mql4 mql5
По поводу типа согласен.. Хотя согласно приведению типов, int к string всё-равно приводится. Так что ошибки по ходу не будет.
А вот зачем её объявлять в старте? Не проще ли глобально? По-моему захламлять старт не самое лучшее решение...
Вообще-то говорили о datetime и int, при чём тут string? О том что ошибки не будет я тоже писал.

Захламлять весь код не самое лучшее решение, не только старт. А в твоём коде с котировками 6 и 7 знаков... Я тоже хотел-бы знать (хз) где такое применяется.
Если-же не учитывать котировки в 6 и 7 знаков то самый короткий код для определения будет такой
Код:
int init()
{
  pt= Point;
  if(Digits  % 2 == 1)
  pt*= 10;
}
 
Последнее редактирование:

hoz

Активный участник
хорошо, все понятно, спасибо! уточнить хотел, вернее не смог скрыть удивления от 6 и 7 знаковых котировок, это где такие если не секрет применяются???:not-good:

А хз, но знаю, что есть. Данный приём не мой.. Как-то ещё начиная изучать мкл смотрел код одного программиста, который популярен на FF, SteveHopwood. Данный приём получения лота мне очень понравился своей наглядностью и я его позаимствовал. Тот человек видать не просто так добавил такие дижитсы в функцию. Я решил оставить, чтоб всё было универсальным максимально.

Вообще-то говорили о datetime и int, при чём тут string? О том что ошибки не будет я тоже писал.

А не обращайте внимания, это у меня моральный перегруз:facepalm: Думал о своём..
 

hoz

Активный участник
Вопрос назрел попутный. Есть эксперт, есть библиотеки. У каждой библиотеки свои заголовочные файлы. В общем, всё как и требуется.
В общем-то было сова без библиотек, решил написать её посредством библиотек. Пошагово начал изменять.. Добавил заголовочные файлы, в которых перечислены функции с их параметрами и есть внешние переменные (extern). Перетягивая эксперт на график у эксперт нет ни одного внешнего параметра... Как такое может быть?
Вот как в эксперте этот кусок кода выглядит:

PHP:
#include <[email protected]>
#include <[email protected]>
#include <[email protected]>

extern string ___H1 = " ________ Параметры общие _________ ";

extern string ___H3 = " _______ Параметры фильтров _______ ";

extern string ___H4 = " ________ Параметры ордера ________ ";
extern double  i_lot = 0.1,
               i_kLot = 2,
               i_sl = 0,
               i_tp = 10,
               i_distanceFromLastPos = 10;
extern string ___H5 = "____ Параметры функции безубытка ___";
extern bool    UseBU  = false;           // включение/выключение функции Б.У.
extern double  i_triggerForBU = 25,      // уровень цены, где выставляется уровень Б.У.
               i_preservedProfit = 5;    // страховочный профит в Б.У.
extern string ___H6 = "____ Параметры трейлинга позиции ___";
extern bool    TSProfitOnly = true;
extern int     TStop.Buy = 70;          // расстояние от текущего курса (пунктов), на котором включается трейлинг, пунктов
extern int     TStop.Sell = 10;         // расстояние от текущего курса (пунктов), на котором включается трейлинг, пунктов
extern int     TrailingStep = 20;       // "шаг" изменения стоплосса (пунктов) (не меньше 1)
extern string ___H7 = " _____ Параметры идентификации ____ ";
extern int     i_magic = 3333021;

// Другие объявленные переменные
datetime g_lastBarTime,                                         // Время проведения последних рассчётов
         g_lastOrderOpenTime;                                 // Время открытия последнего ордера
double SL,
       TP,
       priceBU;
int    massiveOfOrders[7],                                   // Массив ордеров
       g_ticket,
       g_type;

double lastPosOOP = -1;
int    lastPosType = -1;

#define SIGNAL_NO                            -1              // Сигнала нет
#define SIGNAL_BUY                            0              // Сигнал на покупку
#define SIGNAL_SELL                           1              // Сигнал на продажу


Не было инклюдов, всё было как и нужно, а с ними стало не показывать внешних вводимых переменных.

Тяну на график инструмента эксперт и вижу вот такое:

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

AlexeyVik

Программист mql4 mql5
А хз, но знаю, что есть. Данный приём не мой.. Как-то ещё начиная изучать мкл смотрел код одного программиста, который популярен на FF, SteveHopwood. Данный приём получения лота мне очень понравился своей наглядностью и я его позаимствовал. Тот человек видать не просто так добавил такие дижитсы в функцию. Я решил оставить, чтоб всё было универсальным максимально.



А не обращайте внимания, это у меня моральный перегруз:facepalm: Думал о своём..
Я это давно уже заметил... Скоро может уже привыкну к твоим заменам понятий datetime и string... котировка и лот. :D

И ещё раз пытаюсь показать разногласие твоих-же слов.
1. Загромождать код не правильно.
2. Чтоб всё было универсальным максимально.
Если твой советник не будет использоваться с такими котировками зачем они присутствуют в коде???
Если в моём советнике не используются отложенные ордера, то всяческое упоминание о них я удаляю.
 

hoz

Активный участник
Я это давно уже заметил... Скоро может уже привыкну к твоим заменам понятий datetime и string... котировка и лот. :D

И ещё раз пытаюсь показать разногласие твоих-же слов.
1. Загромождать код не правильно.
2. Чтоб всё было универсальным максимально.
Если твой советник не будет использоваться с такими котировками зачем они присутствуют в коде???
Если в моём советнике не используются отложенные ордера, то всяческое упоминание о них я удаляю.

1. Да, с поправкой. Я имел ввиду код эксперта. Если это мешает читабельности. У меня это в библиотеке, там что всё там приемлимо.
2. Хм. Чтоб в будущем если буду катать его на инструментах где 6 или 7 знаков, всё уже работало.
По поводу отложек согласен, ведь это уже не основные инструкции, а второстепенные, так сказать зависящие от логик эксперта. А котировки то получают все эксперты, это базовые функции. Но, опять же, кому как удобнее. Я то не навязываю свою точку зрения. Тока вот сегодня созрела мысль, сделать эту функцию через switch.
От чаще всречаемых ситуации к менее встречаемым идти.. И, если выбор сделан, то break. Тут не будет даже ни грамма лишнего расхода ресурсов. А, находясь в библиотеке, функция и мешать не будет ни глазу ни кому бы то ни было ещё.
 

AlexeyVik

Программист mql4 mql5
1. Да, с поправкой. Я имел ввиду код эксперта. Если это мешает читабельности. У меня это в библиотеке, там что всё там приемлимо.
Может я читать не умею?
Это как-то криво написано. Я делаю проще и чётче:

В глобальных объявить:

PHP:
double pt;
В ИНИТЕ:

PHP:
   if (Digits == 2 || Digits == 4)
      pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
      pt = Point*10;
   if (Digits == 6)
      pt = Point*100;
   if (Digits == 7)
      pt = Point*1000;
В данном случает, не нужно, как принято, делить на поинт, чтоб найти истинное значение.
Рассчитывая значение, просто умножаешь на pt то или иное значение выражения и получаешь значение в пунктах! Мне так удобнее..
Ну, да ладно.
Ты прав в одном. Никому ничего не навязываешь. Я тоже только пытался тебя понять. Делай как знаешь.
 

hoz

Активный участник
Может я читать не умею?

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


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

gzh

Интересующийся
Приветствую.
Парни, подскажите пож-ста, почему лот не увеличивается, написал простую функцию, но она не работает почему-то. Подскажите, что не так в коде. буду благодарен!

PHP:
extern double Profit = 100;
extern double lot = 1;
extern double lot_step = 1;

double size ;

double lots()
{
 
  for (int p=OrdersHistoryTotal()-1; p>=0; p--) {
  OrderSelect(p, SELECT_BY_POS, MODE_HISTORY);
  
   if (OrderProfit() < Profit) { 
   size = OrderLots();
   lot = size + lot_step; } 
   
   if (OrderProfit() >= Profit) lot = lot; }

return(lot);
}
 

qqmber

Почетный гражданин
Приветствую.
Парни, подскажите пож-ста, почему лот не увеличивается, написал простую функцию, но она не работает почему-то. Подскажите, что не так в коде. буду благодарен!

PHP:
extern double Profit = 100;
extern double lot = 1;
extern double lot_step = 1;

double size ;

double lots()
{
 
  for (int p=OrdersHistoryTotal()-1; p>=0; p--) {
  OrderSelect(p, SELECT_BY_POS, MODE_HISTORY);
  
   if (OrderProfit() < Profit) { 
   size = OrderLots();
   lot = size + lot_step; } 
   
   if (OrderProfit() >= Profit) lot = lot; }

return(lot);
}
Тут написано "найти самый старый убыточный ордер в истории и вернуть его лот плюс степ"
Ты верно что-то другое хочешь.

Поправлюсь.
Точнее сказать, "с прибылью меньше желаемой". Сюда пойдут и мелкие положительные прибыли.
Может порядок перебора истории надо поменять?
 
Последнее редактирование:

gzh

Интересующийся
Я хотел написать функцию, которая: если ордер принесет заданный профит, тогда лот остается прежним, если ордер не принесет заданный профит, значит надо увеличить лот. Но почему-то лот не увеличивается. Что не так в коде ??
 

qqmber

Почетный гражданин
Я хотел написать функцию, которая: если ордер принесет заданный профит, тогда лот остается прежним, если ордер не принесет заданный профит, значит надо увеличить лот. Но почему-то лот не увеличивается. Что не так в коде ??

Не надо перебирать всю историю, надо смотреть на последний закрытый ордер. Цикл не нужен, если конечно другие эксперты/руки не закрывают позиции.
 

eevviill

Заблокирован
Не надо перебирать всю историю, надо смотреть на последний закрытый ордер. Цикл не нужен, если конечно другие эксперты/руки не закрывают позиции.
Во. Тоже хотел сказать.
1 вариант брейк вконце цыкла for поставить.
2 вариант без цыкла
 

gzh

Интересующийся
А как тут без цикла ?? ведь нужно узнать закрылся ордер с плюсом или с минусом.
А можно по действиям, что нужно написать, чтобы функция заработала нормально ??
Выручайте парни, сам не справлюсь, я ведь новичок. функция нужна реально.
 

eevviill

Заблокирован
А как тут без цикла ?? ведь нужно узнать закрылся ордер с плюсом или с минусом.
А можно по действиям, что нужно написать, чтобы функция заработала нормально ??
Выручайте парни, сам не справлюсь, я ведь новичок. функция нужна реально.
Последний ордер?
Если да, то просто удали цыкл и глянь что получится.
Не хочешь удалять цыкл, поставь break; в его конце.
 

gzh

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

hoz

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

Реально нужно думать что пишешь. Советую когда пишешь уделять внимание названиям переменных. оно сразу кажется типа не нужным, но со временем начинаешь понимать, как это важно. Так вот, думаешь и пишешь..
И должны быть какие-то адекватные мысли видны у Вас в коде. Если таковых нет, и код совсем из другой оперы, то и помогать нет смысла...
 
Верх