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

vladradon

Программист
Ранее открытого.
Если ранее открытого, то нужно либо при его открытии в отдельную переменную запоминать цену его открытия, либо использовать функцию, которая будет возвращать цену последнего открытого ордера - все зависит от алгоритма.
 

Артмен

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

Спасибо! Буду пытаться.
 

mobidik

-----
Ранее открытого.

Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0":
PHP:
//+------------------------------------------------------------------+
//| Get Open Last Order                                              |
//+------------------------------------------------------------------+
double GetOpenLastOrder()
  {
    double   prc = 0;
    datetime lasttime = 0;
    
    for(int i=OrdersTotal()-1; i>=0; i--)
     {                                               
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
                if(OrderOpenTime()>lasttime)
                 {
                   lasttime = OrderOpenTime();
                   prc = OrderOpenPrice();
                 } 
              } 
           }
        }    
     }
    return(prc); 
  }
//+------------------------------------------------------------------+
 

Elvis Burunduk

Элитный участник
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0"
Ты ваще спишь, ??? Александр . mobidik :facepalm: :D
С НГ Тебя !!!!
 
Последнее редактирование:

mobidik

-----
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0"
Ты ваще спишь, ??? Александр . mobidik :facepalm: :D
С НГ Тебя !!!!

Привет.
спс, взаимно, С НГ и Рождеством!!!
Конечно сплю, в это время меньше отвлекают, имхо.
 

vladradon

Программист
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0":
Без обид и я поздравляю с НГ (присоединяюсь к Элвису Бурундуку) но в коде нет разграничения по бай и селл, что для первоначального кода по-любому (опять же исходя из начально изложенного кода) есть разграничение по бай и селл. Поэтому в функции автоматическую проверку на бай и селл нужно убрать и сделать функцию более универсальной, но с хотя-бы с запросом на направление последнего ордера, если он был. Или с двумя функциями, которые возвращают цены открытия последних ордеров в каждом направлении или одной, но с входным параметром, определяющим направление, определяющим направлением.Технически оба варианта работают одинаково, но просто по-разному прописываются в теле сова. Если я не совсем правильно понял алгоритм (как сеточник с разным направление ордеров или мартин), то можно это сообщение не читать.)))
 
Последнее редактирование:

Xin

Прохожий
Здравствуйте. Скажи возможно ли и как именно это сделать: из индикатора, скрипта или советника узнать последние значения всех индикаторов на главном графике?
Я нашел только две функции ChartIndicatorName и ChartIndicatorsTotal которые естественно не решают задачу. Надо как бы перебрать все значения всех линий индикаторов на главном графике не вызывая их iCustom(). В терминале есть "Окно данных" вызывается клавишами ctrl+D. Вот мне надо все эти данные получить из кода без iCustom().
Возможно такое?
 

Артмен

Новичок форума
Функция вернет значение цены открытия самого последнего ордера, если в рынке еще не было ордеров по данной паре с данным меджиком, ф-ция вернет "0":
PHP:
//+------------------------------------------------------------------+
//| Get Open Last Order                                              |
//+------------------------------------------------------------------+
double GetOpenLastOrder()
  {
    double   prc = 0;
    datetime lasttime = 0;
    
    for(int i=OrdersTotal()-1; i>=0; i--)
     {                                               
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
                if(OrderOpenTime()>lasttime)
                 {
                   lasttime = OrderOpenTime();
                   prc = OrderOpenPrice();
                 } 
              } 
           }
        }    
     }
    return(prc); 
  }
//+------------------------------------------------------------------+

Спасибо за помощь, но задумка была такая:ордера открываются по тренду при выполнении условий входа но с проверкой дистанции до пред идущего ордера, и если при выполнении условий дистанция меньше установленной в настройках ордер не открывается и ждём следующего сигнала. И пока я морочу вам голову, ещё вопрос с которым сейчас я точно не справлюсь, использую индикатор "SupDem1", как написать условие:если при открытии ордера расстояние между ближайшими к цене уровнями поддержки и сопротивления X пунктов или меньше(изменяем алгоритм).
 

Вложения

  • SupDem1.mq4
    18,8 КБ · Просмотры: 19

mobidik

-----
Спасибо за помощь, но задумка была такая:ордера открываются по тренду при выполнении условий входа но с проверкой дистанции до пред идущего ордера, и если при выполнении условий дистанция меньше установленной в настройках ордер не открывается и ждём следующего сигнала. И пока я морочу вам голову, ещё вопрос с которым сейчас я точно не справлюсь, использую индикатор "SupDem1", как написать условие:если при открытии ордера расстояние между ближайшими к цене уровнями поддержки и сопротивления X пунктов или меньше(изменяем алгоритм).

В таком случае задачка усложняется и есть такой нюанс: ордера закрываются по ТР или по обратному сигналу? Если по обратному - то проще, в рынке будут только однотипные ордера, а если по ТР - задачка малость усложняется, нужно определять текущий тренд. Если он только что изменился - можем сразу открываться по текущей цене, а если продолжается - ищем последний открытый ордер в том же направлении. Функцию, что я показал выше, нужно малость изменить - задать возможность поиска ордера по типу, о чем писал ранее vladradon, будет теперь так:

PHP:
//+------------------------------------------------------------------+
//| Get Open Last Order                                              |
//+------------------------------------------------------------------+
double GetOpenLastOrder(int type)
  {
    double   prc = 0;
    datetime lasttime = 0;
    
    for(int i=OrdersTotal()-1; i>=0; i--)
     {                                               
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
             if(OrderType()==type)
              {
                if(OrderOpenTime()>lasttime)
                 {
                   lasttime = OrderOpenTime();
                   prc = OrderOpenPrice();
                 } 
              } 
           }
        }    
     }
    return(prc); 
  }
//+------------------------------------------------------------------+

Её вызов может быть таким:

double last_open_buy  = GetOpenLastOrder(OP_BUY);   // цена открытия последнего ордера BUY
double last_open_sell = GetOpenLastOrder(OP_SELL);  // цена открытия последнего ордера SELL
//+------------------------------------------------------------------+

...использую индикатор "SupDem1", как написать условие:если при открытии ордера расстояние между ближайшими к цене уровнями поддержки и сопротивления X пунктов или меньше(изменяем алгоритм).

Этот индикатор работает на основе ZigZag-а, в таком случае нужно искать последний сигнал от индюка. Сделать это можно, например, так:

PHP:
//+------------------------------------------------------------------+
//| Serch Sig Ind                                                    |
//+------------------------------------------------------------------+
double SerchSigInd(double &PrcUp, double &PrcDn)
  {
    PrcUp=-1;
    PrcDn=-1;
    
    int i = 1;
    while(!IsStopped())
     {
       double sigup = DataInd(0,i);
       double sigdn = DataInd(1,i);
       
       if(PrcUp==-1 && sigup!=EMPTY_VALUE) PrcUp = sigup; 
       if(PrcDn==-1 && sigdn!=EMPTY_VALUE) PrcDn = sigdn;
  
       if(PrcUp!=-1 || PrcDn!=-1) break; // Найден последний сигнал
       if(i>=Bars)  
        {
          Print("Не достаточно глубины истории.");
          break;
        }  
       i++;
     }
    return(0); 
  }
//+------------------------------------------------------------------+
//| Data Ind                                                         |
//+------------------------------------------------------------------+
double DataInd(int bf, int br)
  {
    return(iCustom(NULL,0,"SupDem1",bf,br));
  }
//+------------------------------------------------------------------+

А использовать его с заданной дистанцией, например, так:

PHP:
//+------------------------------------------------------------------+ 
double SigIndUp = -1;
double SigIndDn = -1;

SerchSigInd(SigIndUp, SigIndDn);

if(SigIndUp!=-1)
 {
   // есть от индикатора значение ближайшего уровня сверху
   if(MathAbs(last_open_sell-Bid)/Point > Dist)
    {
      // если текущие растояние от последнего ордера SELL больше за Dist
    }
 }
 
if(SigIndDn!=-1)
 {
   // есть от индикатора значение ближайшего уровня снизу
   if(MathAbs(last_open_buy-Ask)/Point > Dist)
    {
      // если текущие растояние от последнего ордера BUY больше за Dist
    }
 }
//+------------------------------------------------------------------+

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

Flank

Новичок форума
Всех с прошедшими праздниками! Коллеги! Нужна помощь опытного человека, я сам новичок в MQL, только учусь. Опишу тех задание, возможно на форуме есть что-то подходящее и сторожилы форума могут указать (ткнуть носом), а то я битый час ковыряюсь и ничего подходящего не нашел. В общем есть некая точка входа, по обе стороны от нее ставятся по одной отложке на пробой, при касании любой из них, противоположная отложка умножается на множитель задаваемый в настройках (это я победил), если цена возвращается и касается увеличенной отложки, закрывается противоположный открытый ордер и на его месте ставится отложка в том же направлении что закрытый ордер и опять умноженный относительно открытого противоположного и так до достижения тейка. В общем усреднение и последний этап мне не дается. Хочется понять как это делается программно. Буду очень признателен всем отозвавшимся и выжившим после Нового Года ))
 

mobidik

-----
...В общем усреднение и последний этап мне не дается. Хочется понять как это делается программно.

Посмотри ф-ции, что выкладывал чуть выше - там определяется цена открытия последнего ордера, тебе же нужно смотреть не на ордера в рынке, а уже закрытые и вместо цены открытия получать: сперва профит ордера, если он убыточный - узнать с каким лотом был это ордер. Затем увеличиваем размер лота для новой позиции: лот закрытой позы * коеф. увеличения.

PS. в качестве примера, найди на форуме советники с мартином - там именно так и сделано, как тебе нужно.
 

Flank

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

Flank

Новичок форума
тебе же нужно смотреть не на ордера в рынке, а уже закрытые и вместо цены открытия получать: сперва профит ордера, если он убыточный - узнать с каким лотом был это ордер. Затем увеличиваем размер лота для новой позиции: лот закрытой позы * коеф. увеличения.

PS. в качестве примера, найди на форуме советники с мартином - там именно так и сделано, как тебе нужно.

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

mobidik

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

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

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

и на его месте ставится отложка в том же направлении что закрытый ордер и опять умноженный относительно открытого противоположного - можно перед закрытием нужного ордера узнать его тип, цену открытия или уже найти самый последний закрытый ордер и получить эти же данные. Среди открытых ордеров найти самый последний и узнать его лотность. Теперь есть все данные для установки противоположной отложки.

Ничего сложного, просто нужно сперва собрать все нужные данные и выполнить нужное действие.
 

Rennela

Новичок форума
Всем привет. Пытаюсь скрипт написать для удаления из истории баров, которые приходятся на воскресенье(автономный график). Сначала, я так понял нужно открыть файл истории FileOpenHistory- и тут вопрос можно ли удалить эти бары из файла или нужно перезаписывать историю с начала уже без этих баров?
 

Flank

Новичок форума
Ничего сложного, просто нужно сперва собрать все нужные данные и выполнить нужное действие.

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