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

ansol

Местный знаток
Мне вот интересно. Вам переоткрыли ордер. Цена открытия изменилась получается, и она стала равной текущей? А для баланса текущей ситуации по балансу, прибавили(отняли) профит(убыток) так?
У меня такого не было, так что, чтоб понять нада понять что у Вас там происходит.

Ну, надо разбираться с овернайтом - там мутное дело, вместо свопа в минусе в отдельной колонке делают закрытие, потом открытие по цене 00:00 и скомпенсацией какой-то :nda:
Короче, я не хочу в такой бурде ковыряться, но общий смысл у меня вышел такой:
Моя система работала чисто и аккуратно с прибылью в 1% в сутки, этот хитрожопый своп овернайт спиливал 1% в сутки за счет того, что не все сделки интрадей были. Там еще были другие условия не очень, но это не суть - мой трейлинг обломался на 6-знаке, ДЦ не принимал OrderOpenPrice() + i*Point, потому что открытие становилось 6-значным.

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

hoz

Активный участник
Нет! Никак нет! Ни от какого железа ниче не зависит! Можно на ZX Spectrum реализовать астрономические расчеты - никаких проблем! И в шахматы может играть ваш телефон неглупо!
Все зависит от разработчиков софта!


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

Вопрос такой. Есть недокументированный тип ордера 6. Нужно ли его учитывать в функциях, кроме функции работающих с мани-менеджментом или вообще балансом? Да и вообще, интересно, что-нить про данный тип ордера.
Ведь он есть! А почему тогда не документирован?
 

Ugar

Гуру форума
Вопрос такой. Есть недокументированный тип ордера 6. Нужно ли его учитывать в функциях, кроме функции работающих с мани-менеджментом или вообще балансом? Да и вообще, интересно, что-нить про данный тип ордера.
Ведь он есть! А почему тогда не документирован?
Под этим ордером обычно не торговые операции. Например пополнение, снятие денег со счёта, ролловеры на ПАММ счетах. Сворачивание старой истории сделок в результирующую строку... В общем что бы эти операции отображались в истории сделок они присудствуют как ордер 6 типа.
 

hoz

Активный участник
Я тоже с такой фигней сталкивался.
В итоге пришел к тому что сделал отдельный файл с массивом строк и считывал оттуда.


А можно по подробнее? Я так понял, имелось в виду типа лист инструментов. Так это строка, а не массив строк. Для чего понадобился массив строк?
 

qqmber

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

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

EURUSD
//EURGBP // не используется
GBPUSD
AUDUSD
...
 

ansol

Местный знаток
Кусок нагло свистнут с гепард 2.5
Результ вот он:
PHP:
extern string  Symbols1 = "EURUSD: 0; NZDUSD: 0; EURCAD: 0; EURNZD: 0;";
extern string  Symbols2 = "USDJPY: 0; USDCHF: 0; USDCAD: 0; EURAUD: 0;";
extern string  Symbols3 = "EURJPY: 656630; AUDNZD: 0; CHFJPY: 0; CADCHF: 0;";
extern string  Symbols4 = "GBPUSD: 0; GBPAUD: 0; AUDJPY: 0; CADJPY: 0;";
extern string  Symbols5 = "GBPJPY: 0; GBPCHF: 0; NZDJPY: 0; GBPNZD: 0;";
extern string  Symbols6 = "EURGBP: 0; EURCHF: 0; NZDCHF: 0; NZDCAD: 0;";
extern string  Symbols7 = "AUDUSD: 0; AUDCHF: 0; AUDCAD: 0; GBPCAD: 0;";
extern string  Descr1   = "Amp для тестера";
extern int     Amp      = 65;
extern string  Descr2   = "Exp для тестера";
extern int     Exp      = 66;
extern string  Descr3   = "ZigZag";
extern int     ZigZag   = 30;
extern string  Descr4   = "Риск в %% от своб.средств";
extern double  Risk     = 5;
extern string  Descr5   = "Magic Number";
extern int     MagicNumber = 37025;
extern string  Descr6   = "Макс.спред в пунктах";
extern double  MaxSpread = 3; //  стандартных пунктов
extern string  Descr7   = "Номер счета для торговли, 0 - любой счет";
extern int     Account  = 0;
extern string  Descr8   = "Мин. и макс. лот, 0 - без ограничений";
extern double  HighLot  = 0;
extern double  LowLot   = 0;
extern string  Descr9   = "Использовать виртуальный стопаут";
extern bool    StopOut  = true;
extern string  DescrA   = "Порог для стоплосса в пунктах";
extern int     VirtStop = 100;
//--- global variables ---
string         NameExpert = "AnSol ZigZag";
string         sSymbol;
string         sComments;
string         sPair[], sPairID[];
//--- INT ---
int            ExtDeviation = 5;
int            ExtBackStep = 3;
int            Method = 1;
int            ExtDepth, iPips, iTF, iPrevZ, ticks, Rticks, iPairIndex;
//--- DOUBLE ---
double dTFATR, dAVZ, dPairID;
//--- BOOL ---
bool fOpenBuy, fCloseBuy, fOpenSell, fCloseSell;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Sleep(10000);
   iPairIndex = 0;
   if(Account > 0 && Account != AccountNumber()) { Comment("Trade on account: "+AccountNumber()+" FORBIDDEN!\n", TimeToStr(TimeLocal(),TIME_MINUTES)); return(-1); }
   if(!IsExpertEnabled()) { Comment("Experts is disabled!\n", TimeToStr(TimeLocal(),TIME_MINUTES)); return(-1); }
   if(AccountBalance() == 0) { Comment("Zero balance!\n", TimeToStr(TimeLocal(),TIME_MINUTES)); return(-1); }
   iTF = Period();
// Этот кусок формирует массив доступных для торговли валютных пар   
   string SymbolSuffix = "";
   int SymbolEnabled, Separator;
   if (StringLen(Symbol()) > 6) SymbolSuffix = StringSubstr(Symbol(), 6, StringLen(Symbol()) - 1);
   string sPairTemp[], sTFConv, SymbolRow;
      for (int flag = 1; flag < 8; flag++) {
         switch (flag) {
            case 1:
               SymbolRow = Symbols1;
               break;
            case 2:
               SymbolRow = Symbols2;
               break;
            case 3:
               SymbolRow = Symbols3;
               break;
            case 4:
               SymbolRow = Symbols4;
               break;
            case 5:
               SymbolRow = Symbols5;
               break;
            case 6:
               SymbolRow = Symbols6;
               break;
            case 7:
               SymbolRow = Symbols7;
         }
         Separator = glSeparateStringInArray(SymbolRow, sPairTemp, ";");
         for (int isPair = 0; isPair < Separator; isPair++) {
            SymbolEnabled = StringFind(sPairTemp[isPair], ":");
            if (SymbolEnabled != -1) {
               sTFConv = glStringTrimAll(StringSubstr(sPairTemp[isPair], SymbolEnabled + 1));
               if (StringLen(sTFConv) == 6)
                  {
                     sSymbol = glStringTrimAll(StringSubstr(sPairTemp[isPair], 0, SymbolEnabled) + SymbolSuffix);
                     iPairIndex++;
                     ArrayResize(sPair, iPairIndex);
                     ArrayResize(sPairID, iPairIndex);
                     sPairID[iPairIndex - 1] = sTFConv;
                     sPair[iPairIndex - 1] = sSymbol;
                   }
               }
            }
         }
      if(!iPairIndex) { Comment("Нет разрешенных пар для эксперта!"); return(-1); }
Типа, обсуждайте, я участвую :)
 
Последнее редактирование модератором:

ansol

Местный знаток
Если суффикс приделывается после пары, то сова работает как надо. Например, символ имеет вид EURUSD.arm (армада маркет), то сова работает как часы :)
Просто в самой сове идет цикл по iPair и все в порядке.
Вообще, это излишество, но так хочется изобрести универсал :D
Не судите строго! :) Самому стыдно
 

hoz

Активный участник
Кусок нагло свистнут с гепард 2.5
Типа, обсуждайте, я участвую :)

Я "ЗА". У меня как-раз со строками не всё гладко..
Вот кусок:

PHP:
for (int flag = 1; flag < 8; flag++) {
         switch (flag) {


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

ansol

Местный знаток
Зачем ей откуда-то поступать, если она объявлена в цикле?
Имеется 7 ( в данном случае) входных переменных, которые и перебираются по порядку.
Ёжики в данном случае Symbols1...Symbols7 имеют вид
 

hoz

Активный участник
Зачем ей откуда-то поступать, если она объявлена в цикле?
Имеется 7 ( в данном случае) входных переменных, которые и перебираются по порядку.
Ёжики в данном случае Symbols1...Symbols7 имеют вид


Ну так при каждой итерации переменной flag будет присваиваться переменной SymbolRow новое значение. В итоге как ни крути последнее будет 7. Тогда зачем тут цикл? Выбора то нет фиксированного?
 

ansol

Местный знаток
Ну так при каждой итерации переменной flag будет присваиваться переменной SymbolRow новое значение. В итоге как ни крути последнее будет 7. Тогда зачем тут цикл? Выбора то нет фиксированного?
Гхм!
Не понял, вы против кого дружите? :D
Первый раз SymbolRow принимает значение Symbols1, второй раз Symbols2 и т.д. до Symbols7
итого имеем цикл с перебором 7 переменных.
Просто имя переменной = "Symbols" + i
А приходится извращаться с GOTO (CASE - это условное GOTO по сути)
 

qqmber

Почетный гражданин
Ну так при каждой итерации переменной flag будет присваиваться переменной SymbolRow новое значение. В итоге как ни крути последнее будет 7. Тогда зачем тут цикл? Выбора то нет фиксированного?

Вот и мне кажется, что не цикл по flag тут нужен, а extern int flag и дальше switch(flag) с присваиванием нужного "ежика". А пока hoz увы прав, ничего кроме SymbolRow=Symbols7 в итоге не будет.

И еще, что Sleep(10000) тут делает?
 
Последнее редактирование:

hoz

Активный участник
Гхм!
Не понял, вы против кого дружите? :D
Первый раз SymbolRow принимает значение Symbols1, второй раз Symbols2 и т.д. до Symbols7
итого имеем цикл с перебором 7 переменных.
Просто имя переменной = "Symbols" + i
А приходится извращаться с GOTO (CASE - это условное GOTO по сути)

Бред какой-то. Где видно, что имя переменной равно SymbolRow + i ?
Почему при каждой итерации будет прибавляться список1 к предыдущему списку?
Есть выбор и всё! Лично мне это вообще не логично...
 

ansol

Местный знаток
Вот и мне кажется, что не цикл по flag тут нужен, а extern int flag и дальше switch(flag) с присваиванием нужного "ежика". А пока hoz увы прав, ничего кроме SymbolRow=Symbols7 в итоге не будет.

И еще, что Sleep(10000) тут делает?

На Sleep предлагаю не обращать внимание. хотя, очевидно. что init() начинает выполняться через 10 секунд после запуска терминала :D
Что касается ваших рассуждений. то они неправильные. потому что работает так, как я описал, т.е. проверяются и обрабатываются все 7 переменных от Symbols1 до Symbols7
Ну же, напрягитесь - все логично же!

Идея изначально в том, что Symbols1 можно получить как "Symbols" + i при i=1
Неужели такой простой факт не виден невооруженным глазм?
Но средства MQL4 почему-то не позволяют выполнять такие операции с именами переменных. Кишка тонка? ;)
 

ansol

Местный знаток
Бред какой-то. Где видно, что имя переменной равно SymbolRow + i ?
Почему при каждой итерации будет прибавляться список1 к предыдущему списку?
Есть выбор и всё! Лично мне это вообще не логично...

Никто никуда не будет прибавляться! Имя переменной меняется. В случае с CASE имена переменных могут быть любыми, а сделаны они нумерованными, потому что была надежда получать их с помощью переменной цикла - см. выше.
 

hoz

Активный участник
Никто никуда не будет прибавляться! Имя переменной меняется. В случае с CASE имена переменных могут быть любыми, а сделаны они нумерованными, потому что была надежда получать их с помощью переменной цикла - см. выше.

" Была надежда " :facepalm:
 

hoz

Активный участник
На Sleep предлагаю не обращать внимание. хотя, очевидно. что init() начинает выполняться через 10 секунд после запуска терминала :D

Кто сказал?

Что касается ваших рассуждений. то они неправильные. потому что работает так, как я описал, т.е. проверяются и обрабатываются все 7 переменных от Symbols1 до Symbols7
Ну же, напрягитесь - все логично же!

Ну так.. А всё потому, что алгоритм изначально бредовый. Конструкция case придумана для реализации выборки вариантов, а не для "абы чего". а тут хз что им в голову пришло. Условия нет, а вариант есть.

Идея изначально в том, что Symbols1 можно получить как "Symbols" + i при i=1
Неужели такой простой факт не виден невооруженным глазм?

Неа.

Но средства MQL4 почему-то не позволяют выполнять такие операции с именами переменных. Кишка тонка? ;)

У них - ДА!:laugh:
 

ansol

Местный знаток
Ну ладно-ладно, чё прикопался! Не init() начинает выполнятся через 10 сек., а то что написано в init() после sleep :)
Чего опять? Ну семь ёжиков пронумеровано, перебираем их циклом от 1 до 7. Массив, очевидно, не нужен(на фига память временным массивом заполнять?), а нужно каждого ёжика всунуть во временную переменную для обработки.
Я всегда так делаю: взял да и прибавил к префиксу переменную цикла. А в MQL4 так нельзя :(
Кстати, и временная переменная тоже не нужна, если бы было можно имя переменной получать таким способом. Мне вообще исходные данные не нужны, я из них получаю то, что потом реально используется в программе, а extern сделан чисто для удобства пользователя.
 
Последнее редактирование:

qqmber

Почетный гражданин
На Sleep предлагаю не обращать внимание. хотя, очевидно. что init() начинает выполняться через 10 секунд после запуска терминала :D
Что касается ваших рассуждений. то они неправильные. потому что работает так, как я описал, т.е. проверяются и обрабатываются все 7 переменных от Symbols1 до Symbols7
Ну же, напрягитесь - все логично же!

Идея изначально в том, что Symbols1 можно получить как "Symbols" + i при i=1
Неужели такой простой факт не виден невооруженным глазм?
Но средства MQL4 почему-то не позволяют выполнять такие операции с именами переменных. Кишка тонка? ;)
Всё, понял. Действительно, с первого раза не въехал.
Ну нормальное решение, а что смущает. Все помещается в окошки и обрабатывается как надо. Штатного средства заведения массивов через extern все равно нет и динамически конструировать имена переменных тоже нельзя.
 

hoz

Активный участник
:facepalm: Понял то я понял, но решение кривое. У меня нет слов...:facepalm:
 
Верх