Ответ
 
Опции темы
04.02.2015, 10:49
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Сообщение от Picasso Посмотреть сообщение
Немного визуализирую вопрос, может кто поможет.
На обычном макдаке, линия пересекла 0, стрелка постоянно показывает вверх и наоборот, при пересечении вниз.

Вложение 195015

Вложение 195016
Берёшь показания индикатора на первом и втором баре и сравниваешь.
Если на 2 меньше/равно 0 а на 1 больше 0 то пересечение снизу вверх.
Соответственно наоборот
если на 2 больше/равно 0 а на 1 меньше 0 то пересечение сверху вниз.
AlexeyVik вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Picasso (04.02.2015)
04.02.2015, 10:57
Аватар для Picasso
Picasso Местный знаток
Регистрация: 17.04.2013 / Адрес: город-герой ОДЕССА ★ / Сообщений: 388
Поблагодарили 651 раз(а) / Репутация: 652
  • Отправить сообщение для Picasso с помощью Skype™
Сообщение от AlexeyVik Посмотреть сообщение
Берёшь показания индикатора на первом и втором баре и сравниваешь.
Если на 2 меньше/равно 0 а на 1 больше 0 то пересечение снизу вверх.
Соответственно наоборот
если на 2 больше/равно 0 а на 1 меньше 0 то пересечение сверху вниз.
С этим понятно. Если условие выполнено, то переключаем триггер и держим до следующего выполнения.
А вот как вывести стрелку в подвал? Какой функцией?
Picasso на форуме Ответить с цитированиемОтветить с цитированием  
04.02.2015, 11:37
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Сообщение от Picasso Посмотреть сообщение
С этим понятно. Если условие выполнено, то переключаем триггер и держим до следующего выполнения.
А вот как вывести стрелку в подвал? Какой функцией?
Надо добавить ещё 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); 
}//******************************************************************|
AlexeyVik вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Picasso (04.02.2015)
04.02.2015, 15:43
Аватар для sstyle
sstyle Активный участник
Регистрация: 06.01.2015 / Сообщений: 59
Поблагодарили 35 раз(а) / Репутация: 36
Помогите пожалуйста с такой проблемой. Написал индикатор. Считает в реальном времени и пишет в буфер. Но спустя какое-то количество свечей, вся информация исчезает из индикатора, как будто буфер почистили. Как такое может быть?

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

Последний раз редактировалось sstyle; 04.02.2015 в 16:09.
sstyle вне форума Ответить с цитированиемОтветить с цитированием  
04.02.2015, 17:35
Аватар для viplert
viplert Активный участник
Регистрация: 07.01.2014 / Сообщений: 126
Поблагодарили 41 раз(а) / Репутация: 42
Всем привет, помогите написать кусок кода, а имено вирнуальный споплос. То есть в какой то момент, скрипт определял прошла ли цена выше стоплоса или равно и закрывал позицию.
viplert вне форума Ответить с цитированиемОтветить с цитированием  
04.02.2015, 19:56
Аватар для viplert
viplert Активный участник
Регистрация: 07.01.2014 / Сообщений: 126
Поблагодарили 41 раз(а) / Репутация: 42
Написал функцию, проверьте пожалуйста её адэкватность

Код 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); // Закрываем
                  }
                  
               }
            }
        }
   }
}

Последний раз редактировалось viplert; 04.02.2015 в 20:01.
viplert вне форума Ответить с цитированиемОтветить с цитированием  
05.02.2015, 06:20
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Сообщение от 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); // Закрываем
                  }
                  
               }
            }
        }
   }
}
[свернуть]
Вот так всегда и получается. Ожидание помощи и самостоятельное написание заняло всего лишь 2,5 часа.

В принципе написано достойно. Только пара замечаний, проверка магика всё-же нужна и нужна проверка выполнения приказа OrderClose(). Ну и набравшись опыта перепишешь эту функцию ещё короче.
Недокументированная фича mql4
Если в качестве цены закрытия написать OrderClosePrice() то без ошибок закроется и Buy и Sell ордер.
AlexeyVik вне форума Ответить с цитированиемОтветить с цитированием  
05.02.2015, 18:30
Аватар для sstyle
sstyle Активный участник
Регистрация: 06.01.2015 / Сообщений: 59
Поблагодарили 35 раз(а) / Репутация: 36
Алексей, посмотрите мой вопрос пожалуйста
sstyle вне форума Ответить с цитированиемОтветить с цитированием  
05.02.2015, 18:51
Аватар для AlexeyVik
AlexeyVik Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Сообщение от sstyle Посмотреть сообщение
Алексей, посмотрите мой вопрос пожалуйста
Я ещё дважды перечитал твой вопрос, но так и не понял первую его часть. А вторую часть по ненадобности не изучал в таких подробностях чтобы давать советы. Будет нужда, буду разбираться. Да и что такое
Цитата:
потом читать из него, чтобы история подгружалась?
AlexeyVik вне форума Ответить с цитированиемОтветить с цитированием  
05.02.2015, 20:17
Аватар для sstyle
sstyle Активный участник
Регистрация: 06.01.2015 / Сообщений: 59
Поблагодарили 35 раз(а) / Репутация: 36
Ок. запускаю индикатор, он начинает выводить гистограмму и сохраняет в буфер 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, на глаз), все гистограммы исчезают. как будто перезапустился индикатор или другими словами буфер очищается.

Последний раз редактировалось sstyle; 05.02.2015 в 20:21.
sstyle вне форума Ответить с цитированиемОтветить с цитированием  
05.02.2015, 21:31
Аватар для matro3
matro3 Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Этот код никакой ясности не внес.
Пробуйте через Print() выводить что-то в журнал. В каком-то месте проскакивает ноль, я так понимаю...
matro3 вне форума Ответить с цитированиемОтветить с цитированием  
06.02.2015, 05:41
Аватар для Vyacheslav88
Vyacheslav88 Местный знаток
Регистрация: 30.01.2014 / Сообщений: 279
Поблагодарили 985 раз(а) / Репутация: 986
Всем привет. Подскажите что нужно такое прописать в индикаторе чтобы стрелки не перерисовывались. Например вот в этом индикаторе.
Вложения:
Тип файла: mq4 CANDLESTICK.mq4 (14.6 Кб, 8 просмотров)
Vyacheslav88 вне форума Ответить с цитированиемОтветить с цитированием  
07.02.2015, 06:51
Аватар для Milord
Milord Местный знаток
Регистрация: 26.03.2011 / Сообщений: 596
Поблагодарили 702 раз(а) / Репутация: 705
Сообщение от Picasso Посмотреть сообщение
Немного визуализирую вопрос, может кто поможет.
На обычном макдаке, линия пересекла 0, стрелка постоянно показывает вверх и наоборот, при пересечении вниз.

Вложение 195015

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

Доработка ботов (советников, индикаторов) vol. 2

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)
Milord вне форума Ответить с цитированиемОтветить с цитированием  
07.02.2015, 06:54
Аватар для Milord
Milord Местный знаток
Регистрация: 26.03.2011 / Сообщений: 596
Поблагодарили 702 раз(а) / Репутация: 705
Сообщение от Vyacheslav88 Посмотреть сообщение
Всем привет. Подскажите что нужно такое прописать в индикаторе чтобы стрелки не перерисовывались. Например вот в этом индикаторе.
любой индикатор можно сделать не перерисовывающимся, если он будет считать ТОЛЬКО от 1 Бара и дальше назад по времени...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
тестю советники, иногда пишу и дорабатываю их ...
ПУТЬ ДЛИННОЙ В 10000 МИЛЬ НАЧИНАЕТСЯ С 1 ШАГА (Лао Цзы)
Milord вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Vyacheslav88 (07.02.2015)
09.02.2015, 18:40
Аватар для Tonyr
Tonyr Интересующийся
Регистрация: 18.08.2013 / Сообщений: 7
Поблагодарили 0 раз(а) / Репутация: 1
Доброе время суток.
Подскажите что тут не верно.
Пытаюсь написать сову
С открытием отложенных ордеров в обратном направлении от последней открытой сделки.
Но что-то никак не соображу(

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;
}

заранее благодарен
Tonyr вне форума Ответить с цитированиемОтветить с цитированием  
10.02.2015, 04:09
Аватар для matro3
matro3 Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Я вообще не понял ничего ) Какая-то бессмыслица.

Скрытый текст

Код:
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 вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Tonyr (10.02.2015)
10.02.2015, 04:10
Аватар для matro3
matro3 Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Возможно я не понял задачи.
И еще, постарайтесь, пожалуйста, форматировать свой код прежде чем его запостить.
matro3 вне форума Ответить с цитированиемОтветить с цитированием  
10.02.2015, 04:38
Аватар для Vyacheslav88
Vyacheslav88 Местный знаток
Регистрация: 30.01.2014 / Сообщений: 279
Поблагодарили 985 раз(а) / Репутация: 986
Здравствуйте. Подскажите пожалуйста, как прописать в индикаторе функцию: shift - смещение индикатора по горизонтали?
Vyacheslav88 вне форума Ответить с цитированиемОтветить с цитированием  
10.02.2015, 06:11
Аватар для matro3
matro3 Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Индикаторы не писал, но думаю что нужно в буфере отрисовки сдвинуть значения на shift ячеек.
matro3 вне форума Ответить с цитированиемОтветить с цитированием  
10.02.2015, 09:31
Регистрация: 05.01.2012 / Сообщений: 1,149
Поблагодарили 7,800 раз(а) / Репутация: 7844
Сообщение от Vyacheslav88 Посмотреть сообщение
Здравствуйте. Подскажите пожалуйста, как прописать в индикаторе функцию: shift - смещение индикатора по горизонтали?
Все зависит от индикатора, если значение из буфера и сдвиг по барам вперед-назад то достаточно добавить:
PHP код:
SetIndexShift(0,Shift); 
Если используется внешний индикатор то можно так:
PHP код:
...= iAO(NULL0+Shift); 
strannik-ps вне форума Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Vyacheslav88 (10.02.2015)
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 22:27. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO