[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 132

 
Roman.:

ИМХО, не сложно, но очень просто "направить" или отправить, 

 Ну несомненно, проще "отправить" т.е. "послать", чем подсказать. А на самом деле я не спросил ничего такого, чтоб меня в учебник тыкать. Написал в одном месте дубликат правда, но суть не меняется. 

artmedia70:

Ну наконец уже скажите, что именно хотите сделать... Например: МАшка такая-то движется вверх и она выше МАшки такой-то, при этом цена там-то , ниже/выше МАшки такой-то и если всё это true, то выставить такую-то отложку на таком-то расстоянии. Я вам подскажу примерный алгоритм. А то из кусочков вашего кода, вырванных из контекста, сложно вас направить в нужном направлении. А ведь задачка-то для пятого класса (утрированно)



 Вот прилагаю тестовый вариант кода и публикую его тоже в своём посте.

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
// Машечки
double fastMa,
       slowMa;
double pt;
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD);
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa + i_thresholdFromMa * pt) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником

       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
   
   if (ticket > 0)
 
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa - i_thresholdFromMa * pt) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
   
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(fastMa - i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0)
    
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy(fastMa, slowMa))             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell(fastMa, slowMa))           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)       // Если машки указывают вверх..
       if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
           return(SIGNAL_BUY);                       // ..функция возвращает сигнал покупки

   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)      // Если машки указывают вниз..
       if ( MathAbs(Bid - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);                          // ..функция возвращает сигнал продажи
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,1);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,1);

// Отслеживание открытия нового бара
   static datetime lastBarTime = 0;    // Время проведения последних рассчётов
   
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

 В условиях чётко сказано, что цена отложки находится выше(ниже) значения МА+(-) отступ от МА.

Вот оно:

if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt )

 Сигнал должен рассчитываться только тогда, когда цена попала в зону "зазора" МА +(-) отступ. 

 В функции покупки, например:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

 Покупка должна быть выше fastMa на i_thresholdFromMa * pt.

По факту она не там. То ли косяк в языке, то ли в машке дело. Как можно ещё объяснить то что мне нужно? Я привёл целый код без дополнительных условий и функций (только один сигнал голый и открытие).
 

 Написано уже всё чётко (для тестера, проверок не делал под реал никаких!)

Вот как открывает:

 Не там открывает..

 

artmedia70:


По поводу выделенного: работайте по ценам открытия, тогда не будет перерисовки МАшек на нулевом баре

 Я специально сделал условие по 1-ый бар, чтоб не было никаких непоняток. Главное хоть как запустить...
Файлы:
test_ma.mq4  8 kb
 
 Необходимо определять флаг начала например четвертой пятиминутки каждого часа в индикаторе.
if( Minute()==15)
Ничего не пропускает. Толкните в нужную сторону.
 

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

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

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


if( Minute()==15)// так будет работать в течении 1 минуты (от 15 до 16)
if( Minute()>=15)// так от 15 минут и до конца текущего часа
 
Tincup:

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

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


Накинь на график среднюю и погляди какой индекс тебе нужен. Тут визуально то видно.
 
hoz:

 Ну несомненно, проще "отправить" т.е. "послать", чем подсказать. А на самом деле я не спросил ничего такого, чтоб меня в учебник тыкать. Написал в одном месте дубликат правда, но суть не меняется. 

 Вот прилагаю тестовый вариант кода и публикую его тоже в своём посте.

 В условиях чётко сказано, что цена отложки находится выше(ниже) значения МА+(-) отступ от МА.

Вот оно:

 Сигнал должен рассчитываться только тогда, когда цена попала в зону "зазора" МА +(-) отступ. 

 В функции покупки, например:

 Покупка должна быть выше fastMa на i_thresholdFromMa * pt.

По факту она не там. То ли косяк в языке, то ли в машке дело. Как можно ещё объяснить то что мне нужно? Я привёл целый код без дополнительных условий и функций (только один сигнал голый и открытие).
 

 Написано уже всё чётко (для тестера, проверок не делал под реал никаких!)

Вот как открывает:

 

 

 Я специально сделал условие по 1-ый бар, чтоб не было никаких непоняток. Главное хоть как запустить...
Ещё раз спрошу: Когда именно хотите выставить ордер? Не вашим кодом ответьте (не охота в нём разбираться - своих кодов предостаточно к разбору), а просто словами,

например: хочу выставить отложку выше/ниже МАшки на такую-то дистанцию при условии, что ... тыры-пыры-ё-моё ...

Второй раз прошу пояснить, неужели сложно? Уже б давно решили вашу проблему.

 
И ещё: если у вас fastMA и slowMA определены как глобальные, зачем их в функции передаёте? Все функции их и так видят, без передачи их параметров в вызываемую функцию.
 

Доброго времени суток. 

Подскажите как бороться с ГЭПами в советниках?

Часто возникают ГЭПы в период перехода через выходные, и после их возникновения работа с ордерами зависает, как это исправить, за ранее спасибо! 

 

Артём, как Вы думаете, что будет быстрее работать, выражение с MathMax'ами или с if?

double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//это?
// или это?
double dist = NormalizeDouble(Dist*Point,Digits);
if(dist < spread) dist = spread;
if(dist < StopLevel) dist = StopLevel;
if(dist < FreezeLevel) dist = FreezeLevel;


Не объяснил словами, т.к. ясно, что это выражение служит мне избегнуть ошибок 130, и прекрасно служит!

Благодарю заранее!

 
hoz:

Накинь на график среднюю и погляди какой индекс тебе нужен. Тут визуально то видно.

накинул. ответ не совсем мне понятен поэтому переспрошу еще раз. Я правильно вас понял что при формулировке торговых условий надо

надо использовать значение МА на соответствующее количество баров назад но не то значение которое помечено на рисунке желтой стрелкой.

Рисунок нарисовал так как понял ваш ответ. 

Причина обращения: