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

AlexeyVik

Программист mql4 mql5
Немного визуализирую вопрос, может кто поможет.
На обычном макдаке, линия пересекла 0, стрелка постоянно показывает вверх и наоборот, при пересечении вниз.

Посмотреть вложение 195015

Посмотреть вложение 195016
Берёшь показания индикатора на первом и втором баре и сравниваешь.
Если на 2 меньше/равно 0 а на 1 больше 0 то пересечение снизу вверх.
Соответственно наоборот
если на 2 больше/равно 0 а на 1 меньше 0 то пересечение сверху вниз.
 

Picasso

Местный знаток
Берёшь показания индикатора на первом и втором баре и сравниваешь.
Если на 2 меньше/равно 0 а на 1 больше 0 то пересечение снизу вверх.
Соответственно наоборот
если на 2 больше/равно 0 а на 1 меньше 0 то пересечение сверху вниз.

С этим понятно. Если условие выполнено, то переключаем триггер и держим до следующего выполнения.
А вот как вывести стрелку в подвал? Какой функцией?
 

AlexeyVik

Программист mql4 mql5
С этим понятно. Если условие выполнено, то переключаем триггер и держим до следующего выполнения.
А вот как вывести стрелку в подвал? Какой функцией?
Надо добавить ещё 2 буфера и при выполнении условия одному из этих буферов присвоить значение индикатора.

Код:
#property indicator_buffers 4 // было 2
// Добавить цвет значков

int OnInit() 
{

   SetIndexStyle(0, ); // Это было
   SetIndexStyle(1, ); // и это оже

   SetIndexStyle(2, DRAW_ARROW); 
   SetIndexStyle(3, DRAW_ARROW); 
   SetIndexArrow(2, ); // Сюда поставить код значка
   SetIndexArrow(3, ); // сюда тоже

   return(0); 
}//******************************************************************|
 

sstyle

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

И еще вопрос. как записать в файл 8 строк буфера и потом читать из него, чтобы история подгружалась?
 
Последнее редактирование:

viplert

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

viplert

Активный участник
Написал функцию, проверьте пожалуйста её адэкватность

HTML:
// ФУНКЦИЯ ВИРТУАЛЬНОГО СТОПЛОСА
void VirtualStopLos()
{
   if (StopLos != 0) {  
   
         // Текущая цена
         double Price = (Ask+Bid)/2;

         for(int i = OrdersTotal(); i >= 0; i--)
         {    
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            if(OrderSymbol() == Symbol()) 
            {
               if(OrderType() == OP_BUY)
               {
                  // Покупка условия выхода
                  double SL = NormalizeDouble(OrderOpenPrice() - StopLos * Point, Digits); // Цена стоплос
                  if(Price <= SL)
                  {
                     // Выход из позиции
                     OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Violet); // Закрываем
                  }
                   
               }
               else
               if(OrderType() == OP_SELL)
               {
                  // Продажа  условия выхода
                  double SL = NormalizeDouble(OrderOpenPrice() + StopLos * Point, Digits); // Цена стоплос
                  if(Price >= SL)
                  {
                     // Выход из позиции
                     OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Violet); // Закрываем
                  }
                  
               }
            }
        }
   }
}
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Написал функцию, проверьте пожалуйста её адэкватность

HTML:
// ФУНКЦИЯ ВИРТУАЛЬНОГО СТОПЛОСА
void VirtualStopLos()
{
   if (StopLos != 0) {  
   
         // Текущая цена
         double Price = (Ask+Bid)/2;

         for(int i = OrdersTotal(); i >= 0; i--)
         {    
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            if(OrderSymbol() == Symbol()) 
            {
               if(OrderType() == OP_BUY)
               {
                  // Покупка условия выхода
                  double SL = NormalizeDouble(OrderOpenPrice() - StopLos * Point, Digits); // Цена стоплос
                  if(Price <= SL)
                  {
                     // Выход из позиции
                     OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Violet); // Закрываем
                  }
                   
               }
               else
               if(OrderType() == OP_SELL)
               {
                  // Продажа  условия выхода
                  double SL = NormalizeDouble(OrderOpenPrice() + StopLos * Point, Digits); // Цена стоплос
                  if(Price >= SL)
                  {
                     // Выход из позиции
                     OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Violet); // Закрываем
                  }
                  
               }
            }
        }
   }
}
Вот так всегда и получается. Ожидание помощи и самостоятельное написание заняло всего лишь 2,5 часа.

В принципе написано достойно. Только пара замечаний, проверка магика всё-же нужна и нужна проверка выполнения приказа OrderClose(). Ну и набравшись опыта перепишешь эту функцию ещё короче.
Недокументированная фича mql4
Если в качестве цены закрытия написать OrderClosePrice() то без ошибок закроется и Buy и Sell ордер.
 

AlexeyVik

Программист mql4 mql5
Алексей, посмотрите мой вопрос пожалуйста
Я ещё дважды перечитал твой вопрос, но так и не понял первую его часть. А вторую часть по ненадобности не изучал в таких подробностях чтобы давать советы. Будет нужда, буду разбираться. Да и что такое
потом читать из него, чтобы история подгружалась?
 

sstyle

Активный участник
Ок. запускаю индикатор, он начинает выводить гистограмму и сохраняет в буфер 8 массивов:

Код:
   SetIndexBuffer( 0, sum );    SetIndexLabel( 0, NULL );       SetIndexStyle( 0, DRAW_HISTOGRAM );
   SetIndexBuffer( 1, m15 );    SetIndexLabel( 1, NULL );       SetIndexStyle( 1, DRAW_HISTOGRAM );
   SetIndexBuffer( 2, m5 );    SetIndexLabel( 2, NULL );       SetIndexStyle( 2, DRAW_HISTOGRAM );
   SetIndexBuffer( 3, tek );    SetIndexLabel( 3, NULL );       SetIndexStyle( 3, DRAW_HISTOGRAM );
   SetIndexBuffer( 4, gadblSlope );  SetIndexLabel( 4, "Indicator" );    SetIndexStyle( 4, DRAW_NONE );
   SetIndexBuffer( 5, gadblUp1 );    SetIndexLabel( 5, NULL );       SetIndexStyle( 5, DRAW_NONE );
   SetIndexBuffer( 6, gadblUp2 );    SetIndexLabel( 6, NULL );       SetIndexStyle( 6, DRAW_NONE );
   SetIndexBuffer( 7, gadblDn1 );    SetIndexLabel( 7, NULL );       SetIndexStyle( 7, DRAW_NONE );

Спустя какое-то количество свечей (максимум 120, на глаз), все гистограммы исчезают. как будто перезапустился индикатор или другими словами буфер очищается.
 
Последнее редактирование:

matro3

Почетный гражданин
Этот код никакой ясности не внес.
Пробуйте через Print() выводить что-то в журнал. В каком-то месте проскакивает ноль, я так понимаю...
 

Vyacheslav88

Элитный участник
Всем привет. Подскажите что нужно такое прописать в индикаторе чтобы стрелки не перерисовывались. Например вот в этом индикаторе.
 

Вложения

  • CANDLESTICK.mq4
    14,6 КБ · Просмотры: 26

Milord

Местный знаток
Немного визуализирую вопрос, может кто поможет.
На обычном макдаке, линия пересекла 0, стрелка постоянно показывает вверх и наоборот, при пересечении вниз.

Посмотреть вложение 195015

Посмотреть вложение 195016

для тех кто не силен в языке MQL4 - есть ветка по бесплатной доработке советников и индикаторов, вот тут:

http://forexsystemsru.com/yazyk-programmirovaniya-mql4/77111-dorabotka-botov-sovetnikov-indikatorov-vol-2-a.html
 

Milord

Местный знаток
Всем привет. Подскажите что нужно такое прописать в индикаторе чтобы стрелки не перерисовывались. Например вот в этом индикаторе.
любой индикатор можно сделать не перерисовывающимся, если он будет считать ТОЛЬКО от 1 Бара и дальше назад по времени...
 

Tonyr

Интересующийся
Доброе время суток.
Подскажите что тут не верно.
Пытаюсь написать сову
С открытием отложенных ордеров в обратном направлении от последней открытой сделки.
Но что-то никак не соображу:((

int start()
{
int total=OrdersTotal();
if(total<MaxOrders)
OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,CLR_NONE);
else
{
for (int i=0; i<OrdersTotal(); i++) // По всем ордерам
{
if(OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующ.
{
int Total = OrdersTotal(); // TakeProfit ордера
double Price = OrderOpenPrice();
double Lots = OrderLots(); // Количество лотов
if (Total>1){
OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid,slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,CLR_NONE);
}
}
}
}

return;
}

заранее благодарен
 

matro3

Почетный гражданин
Я вообще не понял ничего ) Какая-то бессмыслица.
Код:
int start()
{
   int total=OrdersTotal(); 
   if(total<MaxOrders)
      OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber ,0,CLR_NONE);
   else
   {
      for (int i=0; i<OrdersTotal(); i++) // По всем ордерам
      {
         if(OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующ.
         { 
            int Total = OrdersTotal(); // TakeProfit ордера
            double Price = OrderOpenPrice(); 
            double Lots = OrderLots(); // Количество лотов
            if (Total>1)
            {
               OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid,slippage,B id+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,CLR_NONE);
            }
         }
      }
   }

   return;
}

Тут код, возвращающий тип последней сделки:
_http://forum.mql4.com/ru/38949/page4#434228
Теперь:
Код:
int type = GetTypeLastOpenPos(_Symbol, mn);
if(type == OP_BUY)
{
   // Открываем в продажу
}
if(type == OP_SELL)
{
   // Открываем в покупку
}
 

matro3

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

Vyacheslav88

Элитный участник
Здравствуйте. Подскажите пожалуйста, как прописать в индикаторе функцию: shift - смещение индикатора по горизонтали?
 

matro3

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

strannik-ps

VIP-участник
Здравствуйте. Подскажите пожалуйста, как прописать в индикаторе функцию: shift - смещение индикатора по горизонтали?

Все зависит от индикатора, если значение из буфера и сдвиг по барам вперед-назад то достаточно добавить:
PHP:
SetIndexShift(0,Shift);
Если используется внешний индикатор то можно так:
PHP:
...= iAO(NULL, 0, i +Shift);
 
Верх