Jump to content

Общие вопросы по языку MQL


Recommended Posts

Hi-Fi

Что именно цикл должен делать? Сейчас при любом количестве ордеров в истории больше 0 будет всегда выполняться NewOrder = True;

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

Что бы не было после закрытия, повторного открытия в ту же сторону.

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

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

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

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Fargoth

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

Что бы не было после закрытия, повторного открытия в ту же сторону.

Как вариант:

Можно запоминать тикеты ордеров BUY и SELL при открытии.

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

Ну и проверку на актуальность тикета надо:

static int ticketUp = 0;

...

if (ticketUp != 0)
  {
  if (OrderSelect(ticketUp, SELECT_BY_TICKET))
    {
    if (OrderCloseTime() != 0)
      ticketUp = 0;
    }
  else
    {
    PrintFormat("OrderSelect() was failed, Code of error = d%", GetLastError());
    ticketUp = 0;
    }
  }

if (ticketUp == 0)
  ticketUp = OrderSend(...

 

Edited by Fargoth
Link to post
Share on other sites
Hi-Fi

Сам попросил

Перебирает цикл, а эта выбирает. Думаю, ты это и имел ввиду.

 

ctm>0 действительно всегда истинно.

NewOrder перед циклом инициализирована в false, то есть в 0. OP_BUY это то же 0. Значит NewOrder == OP_BUY то же истинно. В итоге if(ctm>0 && NewOrder == OP_BUY) = true. По крайней мере пока NewOrder не сменил состояние.

 

Дальше выполняется проверка ещё одного условия. Если выбранный ордер Sell типа. Но условия заканцивается точкой с запятой, значит при соблюдении этого условия ничего делать не надо.

 

Да, эта операция будет выполняться всегда.

 

Это условие выполняется всегда. ctm>0=true, NewOrder теперь true, значит =1. OP_SELL=1. if(ctm>0 && NewOrder == OP_SELL)=true.

 

Здесь проверяется что выбранный ордер Buy типа. Но никаких операций нет.

 

Операция присвоения истины переменной NewOrder уже выполнялось выше, с тех пор ничего не изменилось.

 

Верно. По сити получается проверка наличия исторических ордеров любого типа. Если есть хотя бы один закрытый ордер NewOrder = True

ааааааааааа ](*,)

ни так :smt089 ни так  :mdance:  не помогает. :confused:

так хорошо расписали, что не правильно,

поясните, так как всетаки надо.

 

:ahelp::help: :help:

Link to post
Share on other sites
Ugar68

поясните, так как всетаки надо.

Я же написал кусок кода и описал результат работы.

Остаётся вставить его в нужное место и правильно использовать переменную с результатом.

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Hi-Fi

Я же написал кусок кода и описал результат работы.

Остаётся вставить его в нужное место и правильно использовать переменную с результатом.

Вот что у меня есть... :)

//Buy
      
      if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if (!IsTrade)
            {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (StopLossMode) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (TakeProfitMode) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 2) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			} else {
				Print("Error opening BUY order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
        
         if (Sound_Open!="") PlaySound(Sound_Open);
         Alert("Ордер Buy открыт!");
        
          return(0);

Но в какое бы место я его не ставил, в начало или перед Ticket = OrderSend,  то или компиляция не идет или же все равно идут не в разнобой сделки. :cry::confused:

Link to post
Share on other sites
Ugar68

Вот что у меня есть... :)

//Buy
      
      if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if (!IsTrade)
            {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (StopLossMode) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (TakeProfitMode) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 2) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			} else {
				Print("Error opening BUY order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
        
         if (Sound_Open!="") PlaySound(Sound_Open);
         Alert("Ордер Buy открыт!");
        
          return(0);

Но в какое бы место я его не ставил, в начало или перед Ticket = OrderSend,  то или компиляция не идет или же все равно идут не в разнобой сделки. :cry::confused:

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

Непонятно что за переменная SIGNAL_BUY. Скорее всего можно мой кусок кода расположить перед этими открытиями и манипулировать этими сигнальными переменными.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Ugar68

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

Непонятно что за переменная SIGNAL_BUY. Скорее всего можно мой кусок кода расположить перед этими открытиями и манипулировать этими сигнальными переменными.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Hi-Fi

"SIGNAL_BUY" равен условиям на покупку...

Спасибо, пробую..., но пока не очень...(((

Link to post
Share on other sites
MW

Здраввствуйте. Вот вопрос по индикаторам. Возможно ли при отрисовке на истории, получить значение кастомного индикатора в момент появления нового бара и использовать его при расчётах в нём самом? Как это можно представить? Спасибо.


Жми быка! Дави медведя!

Link to post
Share on other sites
AntFX

 

 

Здраввствуйте. Вот вопрос по индикаторам. Возможно ли при отрисовке на истории, получить значение кастомного индикатора в момент появления нового бара и использовать его при расчётах в нём самом? Как это можно представить? Спасибо.

Конечно можно. Это называется рекурсивным вызовом. Делается через функцию iCustom(...). Нужно только следить, чтобы эти вызовы самого себя не привели к зацикливанию.


1

Link to post
Share on other sites
kazakov.v

 

 

получить значение кастомного индикатора в момент появления нового бара

 

Использовать цену Open[]


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
Hi-Fi

Как то так.

int total, i, LastHistOrderType=-1;
   datetime OrdTime, LastOrdTime;
   total=OrdersHistoryTotal();
   for(i=total-1; i>=0; i--)
      {
      ResetLastError();
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
         {
         Print("Исторический ордер не выбран, ошибка = ",GetLastError());
         continue;
         }
      OrdTime=OrderCloseTime();
      if(LastOrdTime<OrdTime)
         {
         LastOrdTime=OrdTime;
         LastHistOrderType=OrderType();
         }
      }

Этот код ищет последний закрытый ордер в истории, его тип будет в переменной LastHistOrderType 0-Buy, 1-Sell, -1 если последний закрытый ордер не найден.

Этот код надо вставить перед открытием ордера, что бы определить какой был закрыт.

СПАСИБО!!! Разобрался, заработало. :)

Link to post
Share on other sites
  • 1 month later...
OmegaS

Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4.

Link to post
Share on other sites
kazakov.v

Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4.

 

if( x%2 == 0 ) - значит х- четное

  • Thanks 2

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
абыр валГ

Подскажите , как возможно определить четность числа . Есть ли такая функция в MQL4.

Можно поделить его на 2 и проверить есть ли остаток от деления.

  • Thanks 1
Link to post
Share on other sites
OmegaS

if( x%2 == 0 ) - значит х- четное

разьясните пож. выражение

Link to post
Share on other sites
Ugar68

разьясните пож. выражение

Если остаток от деления х на 2 равен 0, то х четное.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
pr0gre55

привет,

 

MQL5

не могу разобраться с Printf():

 

объявляю в переменных

 int    handle_if;

 

Хэндл выводится, индикатор на графике показывается.

 

Позже вывожу:

printf("handle_if ",IntegerToString(handle_if)); 

 

в логе

20:20:29.030 118 (EURUSD,H1) handle_if 

 

что не так делаю?

 

  printf("IF ", IntegerToString(BarsCalculated(handle_if)));
  printf("IMA ", IntegerToString(BarsCalculated(handle_ima)));
 
выводит только:
2015.08.24 20:20:42.368 118 (EURUSD,H1) IMA 
2015.08.24 20:20:42.368 118 (EURUSD,H1) IF 
 

 

Edited by pr0gre55
Link to post
Share on other sites
Den2S

Резервирование VPS или как организовать 2VPS на один торговый счет?

 

Интересует как сделать так чтобы один счет управлялся с двух VPS по одной и той же торговой системе,

при этом чтобы VPS2 проставлял ордера только в случае если VPS1 оказался неисправным, недоступным, отключенным или еще как неработоспособным.

 

Как наладить их синхронную работу не нарушая принципа работы торговой системы?


Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
kazakov.v

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 сутки.

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

Как только "сигнальный" ордер появился с "правильным" временем экспирации - вспомогательный советник не торгует.

  • Thanks 3

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
абыр валГ

Резервирование VPS или как организовать 2VPS на один торговый счет?

 

Интересует как сделать так чтобы один счет управлялся с двух VPS по одной и той же торговой системе,

при этом чтобы VPS2 проставлял ордера только в случае если VPS1 оказался неисправным, недоступным, отключенным или еще как неработоспособным.

 

Как наладить их синхронную работу не нарушая принципа работы торговой системы?

Без костылей никак,  МТ4 не будет работать в кластере(софт изначально должен поддерживать это).

Либо машину виртуалить на кластерах и на ней мт4 запускать, вот пример http://habrahabr.ru/post/77836/

Edited by абыр валГ
Link to post
Share on other sites
Den2S

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 сутки.

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

Как только "сигнальный" ордер появился с "правильным" временем экспирации - вспомогательный советник не торгует.

 

Чё-то не понял я .

Почему один час?

 

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

Тогда ордер должен выставить второй.

 

Если второй ВПС будет выставлять ордер через 1 час, то цена за этот час уйдет далеко и безвозвратно ...


Тот инвестор, который не фиксирует каждые 5% прибыли со своего счета, в результате потеряет всё.

(Касается любого инвестирования в памм-индустрии). Den2S (©)

Link to post
Share on other sites
kazakov.v

 

 

Чё-то не понял я

 

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

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

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

  • Thanks 1

Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
pr0gre55

MQL5

но вопрос не по коду,

 

в настройках MetaTrader стоит галочка-Разрешить автоматическую торговлю

Экспертом открываю ордер-получаю ошибку 10027 AutoTrading disabled by client

 

Почему?

Link to post
Share on other sites
OmegaS

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

int WRITE_GLOBAL_CHAR(string File)
{
 int res;
 int file_handle=FileOpen(File,FILE_WRITE|FILE_TXT);
   if(file_handle!=INVALID_HANDLE)
     {
     // PrintFormat("Файл %s открыт для записи",File);
           //--- сначала запишем количество сигналов
      res=FileWrite(file_handle,"VALUE1="+VALUE1);
      FileWrite(file_handle,"VALUE2="+VALUE2);
      //--- запишем время сигналов и их значения в файл
        //--- закрываем файл
      if (res==0) {PrintFormat("Ошибка записи!!!!",GetLastError());}

      FileClose(file_handle);
   //   PrintFormat("Данные записаны, файл %s закрыт",File);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",File,GetLastError());
  
  
  return(0);
  }


   
 
 

 не знаю как разрулить (( прощу помощи.

 int READ_CLOBAL_CHAR(string File)
  {
  
  int Poz_v1,Poz_v2;
  string strv1,strv2;
       
      int fileopen=FileOpen(File,FILE_READ|FILE_TXT,";",CP_UTF8);
     if(fileopen<0)
     {
     // MessageBox("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }

    string sString = "";
    if (fileopen > 0)
     {  
      
      while (!FileIsEnding(fileopen))
       { 
        sString = FileReadString(fileopen);
                  
        Poz_v1=StringFind(sString,"VALUE1=",0);
        if (Poz_v1>0)        { strv1=StringSubstr(sString, Poz_v1+7,1);
        {v1=StringToInteger(strv1); 
         Print("НАЧАЛЬНО --VALUE1= ",v1);
         }
        
        // Print("НАЧАЛЬНО = ",sString);
       
         }
         
       }
     } 
       FileClose(fileopen);
   
  
  return(0);
Edited by OmegaS
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...