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

matro3

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

AlexeyVik

Программист mql4 mql5
)) Да ладно, человек пишет код, значит должен что-то волочь в этой теме.
А вообще да.
Свой код не проверял, но думаю что должен ворачивать наименьшее кол-во пунктов из открытых ордеров по символу и мэджику. В любую сторону.
Мне кажется что твой код вернёт кол-во пунктов или первого, или последнего открытого ордера. Не хочу возвращаться к твоему коду, а так не помню направление перебора. Ведь там просто перебор ордеров и определение расстояния с присвоением этого значения переменной р.
 

matro3

Почетный гражданин
Код:
fot(int i=0; i<OrdersTotal(); i++)
{
   int p=0;
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==mn)
         {
            if(OrderType()==OP_BUY)
               if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
                  p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
            if(OrderType()==OP_SELL)
               if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
                  p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
         }
   return(p);
}
Там же проверка стоит. Если новое расстояние меньше, то берем его.
Присвоил по умолчанию ноль и поправил условия.
Вобщем хозяин вопроса - проверяй и напиши что не так )
 

Alexz2107

Интересующийся
Спасибо за внимание matro3 и AlexeyVik! Все равно не работает, я скомпилировал в таком виде, добавил глобальные переменные, без них компилятор ругается и вырезал проверку магика
int i;
int p;

int fot(int i=0); i<OrdersTotal(); i++) {
int p=0;
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderSymbol()==_Symbol)
{
if(OrderType()==OP_BUY)
if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
if(OrderType()==OP_SELL)
if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
}
return(p);
}
//-----------
int start() // Спец. функция start()
{
Comment("Показатель ",p,"");
}
но показатель всегда пишет 0. На счет при этом открыт ордер 0.10 с просадкой -60.
 

AlexeyVik

Программист mql4 mql5
Код:
fot(int i=0; i<OrdersTotal(); i++)
{
   int p=0;
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==mn)
         {
            if(OrderType()==OP_BUY)
               if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
                  p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
            if(OrderType()==OP_SELL)
               if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
                  p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
         }
   return(p);
}
Там же проверка стоит. Если новое расстояние меньше, то берем его.
Присвоил по умолчанию ноль и поправил условия.
Вобщем хозяин вопроса - проверяй и напиши что не так )
Ну, да... Я не заметил сравнения с р. Поэтому я всегда ставлю пробелы. Конечно в таком, новом виде код будет работать правильно. А вот другой вариант этой функции:
Код:
double f_00()
{
   int p=0;
for(int i=0; i<OrdersTotal(); i++)
  {
   if(OrderSelect(i, SELECT_BY_POS, && OrderSymbol() == _Symbol && OrderMagicNumber() == mn))

           p = p > 0
            ? MathMin(р, MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID)))     
             : MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID));
         
 }
   return(p);
}
Есть у тебя некоторые явные ошибки, р объявлено в цикле, соответственно переинициализируется на каждой итерации цикла и return не там...
В моём варианте за парность скобок не ручаюсь, хотя старался не пропустить.
 

AlexeyVik

Программист mql4 mql5
Спасибо за внимание matro3 и AlexeyVik! Все равно не работает, я скомпилировал в таком виде, добавил глобальные переменные, без них компилятор ругается и вырезал проверку магика

но показатель всегда пишет 0. На счет при этом открыт ордер 0.10 с просадкой -60.
Конечно если тебе важно в каком направлении отклонение от цены открытия, то надо делить по типу ордера.
 

matro3

Почетный гражданин
Верно, с return напутал.
Код:
int minPP()
{
   fot(int i=0; i<OrdersTotal(); i++)
   {
      int p=0;
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderSymbol()==_Symbol)
            if(OrderMagicNumber()==mn)
            {
               if(OrderType()==OP_BUY)
                  if((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point<p || p==0)
                     p=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/Point;
               if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point<p || p==0)
                     p=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/Point;
            }
   }
   return(p);
}
int start()
{
   Comment("Показатель ",minPP(),"");
}
 

Alexz2107

Интересующийся
Вот, спасибо! Я все это время не так функцию подставлял, в этом и вся проблема!!! Испытал свой первоначальный вариант, он функционирует! Если интересно - Ваш вариант при компиляции выдает следующие ошибки, вариант AlexeyVik компилируется, но выдает всегда 0. Еще раз благодарю за внимание и помощь!
a3f87d91a9d69497ba3105a6c40e3d55.jpg
 

AlexeyVik

Программист mql4 mql5
Вот, спасибо! Я все это время не так функцию подставлял, в этом и вся проблема!!! Испытал свой первоначальный вариант, он функционирует! Если интересно - Ваш вариант при компиляции выдает следующие ошибки, вариант AlexeyVik компилируется, но выдает всегда 0. Еще раз благодарю за внимание и помощь!
a3f87d91a9d69497ba3105a6c40e3d55.jpg
Он компилироваться не мог. Как я ни старался, скобки были не парными, переменная р должна быть double а я её оставил как у matro3 типом int потому и выдавал всегда 0. Вот проверенный вариант в виде скрипта.
Код:
/********************************************************************\
//|                                                  !!! ScrTest.mq4 |
//|                                         Copyright 2014, Viktorov |
//|                                                   [email protected] |
\********************************************************************/
#property copyright "Copyright 2014, Viktorov"
#property link      "[email protected]"
#property version   "1.00"
#property strict

void OnStart()
{/*******************Script program start function*******************/
  double p = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == _Symbol)

           p = p > 0
            ? MathMin(p, MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID)))     
             : MathAbs(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_BID));
         
  }
   Alert((int)(p/Point));
}/*******************************************************************/
 

Александр_Стручков

Интересующийся
Уважаемые, вопрос жизни и смерти :(

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

PHP:
for(int i=0;i>=kol-1;i++) // Цикл открытия отложенных ордеров
        {
         ask2=Ask+r1*Point + r2*i*Point; // Рассчитываем размер позиции для каждой итерации
         bid2=Bid-r1*Point - r2*i*Point;   // Рассчитываем размер позиции для каждой итерации
         ord=OrderSend(Symbol(),OP_BUYSTOP,lot2,ask2,slippage,0,0,NULL,magic,0,clrNONE); // открываем ордер BUYSTOP
          ord=OrderSend(Symbol(),OP_SELLSTOP,lot2,bid2,slippage,0,0,NULL,magic,0,clrNONE); // открываем ордер SELLSTOP
        }
 

AlexeyVik

Программист mql4 mql5
Уважаемые, вопрос жизни и смерти :(

Данный код, по идее, должен выставлять сетку из отложенных ордеров, но почему-то вообще ничего не происходит. В журнале даже никаких сообщений об ошибках не появляется. Кто-нибудь может подсказать, почему он не работает?
А условие при котором начинается цикл???
 

eevviill

Заблокирован
Уважаемые, вопрос жизни и смерти :(

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

...
не
PHP:
for(int i=0;i>=kol-1;i++)
а
PHP:
for(int i=0;i<=kol-1;i++)
 

hollydiger

Прохожий
Добрый день, товарищи программисты. :)

В сети много раз встречал функции по определению времени до конца текущего бара. Но все они работали с TimeCurrent, через серверное время. Это вызывает задержку таймера, т.к. тик приходит не каждую секунду и время таймера останавливается. Или получается отрицательное время, по той же причине, что новый бар уже есть, а время еще не обновилось... Советник работает через OnTimer (обновляется каждую секунду, а не с новым тиком).

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

Большое спасибо!
 

matro3

Почетный гражданин
_http://docs.mql4.com/ru/eventfunctions
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Добрый день, товарищи программисты. :)

В сети много раз встречал функции по определению времени до конца текущего бара. Но все они работали с TimeCurrent, через серверное время. Это вызывает задержку таймера, т.к. тик приходит не каждую секунду и время таймера останавливается. Или получается отрицательное время, по той же причине, что новый бар уже есть, а время еще не обновилось... Советник работает через OnTimer (обновляется каждую секунду, а не с новым тиком).

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

Большое спасибо!
Вся проблема заключается в том, что void OnTick() выполняется только при поступлении нового тика. Так если последний тик был за 0.5 секунды до завершения бара, а следующий поступил только через 2 секунды нового бара, то и откроется новый бар через 2 секунды, и соответственно void OnTick() будет обработана в это-же время. А поскольку определить локальное время так-же как и время сервера можно только при поступлении тика, то эти пляски с бубном не дадут положительного результата.
Опять-же если поставить определение нового бара в void OnTimer() то там, наверное надо будет проверять значение индикаторов или ещё чего-то связанное с первым баром. Но пока не поступил первый тик нового бара он не появится и первым будет не тот бар который хочется.
Допустим учли возможность такой задержки и прописали брать данные по нулевому бару... а первый тик взял да и совпал с временем Open[0]
Как ни крути ничего не выходит. Это мои попытки обойти эту проблему. Если найдёшь выход из ситуации пиши...
 

matro3

Почетный гражданин
Код:
int OnInit()
{
   if(!EventSetTimer(int  seconds) GetLastError();
   return(INIT_SUCCEEDED);
}
void OnTimer()
{
   // какой-то код
}
void OnDeinit()
{
   EventKillTimer();
}
Так не сработает?
 

AlexeyVik

Программист mql4 mql5
Код:
int OnInit()
{
   if(!EventSetTimer(int  seconds) GetLastError();
   return(INIT_SUCCEEDED);
}
void OnTimer()
{
   // какой-то код
}
void OnDeinit()
{
   EventKillTimer();
}
Так не сработает?
Так сработает, но новый бар появится только с первым тиком нового бара. Последи за графиком и временем. Бар появляется не тогда когда закончилось время бара, а когда приходит тик. И соответственно все расчёты связанные с барами работают не правильно.

Особенно хорошо это видно у ГрандКапитал на опционах. Там я наблюдал задержку на М5 до 2 минут.
 
Последнее редактирование:

matro3

Почетный гражданин
Код:
input int timerSeconds = 1;

MqlDateTime str1;

int OnInit()
  {
   EventSetTimer(timerSeconds);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   EventKillTimer();
   Comment("");
  }
void OnTick()
  {
   
  }
void OnTimer()
  {
   TimeLocal(str1);
   Comment(str1.sec);
  }
Ларчик просто открывался
 

ctmcn

Новичок форума
AlexeyVik
Вы тут _http://forum.mql4.com/ru/65341/page29
приводили пример, как доработать код в советнике, чтобы появилась возможность ручного подтверждения открытия ордеров, которая при обновлении с 670 на 745 билд канула в лету...
Я не настолько силен, чтоб понять куда и чего...
Использую простой шаблон, где гоняю условия. Подскажите, плиз, куда и чего, что бы было ручное подтверждение открытия/закрытия ордеров.
С уважением.

P.S. Шаблон прилагаю.
 

Вложения

  • A.mq4
    13,5 КБ · Просмотры: 37
Последнее редактирование модератором:
Верх