¿Un error en la función OrderSend()? - página 9

 
borilunad:
Por lo tanto, no es necesario establecer una relación exacta entre los hisopos y las barras. Sólo se puede considerar a los hisopos con hisopos y es mejor usarlos como filtros en lugar de señales.

Boris, tienes parte de razón. Básicamente los biseles son un puntero. De nuevo, sin embargo, hay algunas opciones aquí. Algunos buscan entrar en una contra-tendencia y otros buscan seguir la tendencia. Hay un montón de variaciones, pero no han funcionado todavía :(
 
hoz:

Boris, en parte tienes razón. Básicamente, los vagones son un puntero. De nuevo, sin embargo, hay varias opciones aquí. Algunos buscan entrar en una contra-tendencia, y otros entran en una tendencia... Hay muchas variaciones, pero aún no han funcionado como se esperaba :(
¡No te pongas triste por los demás! Busca el tuyo y lo encontrarás. Si no se sabe qué hacer, no se puede hacer, porque el precio no puede seguir el ritmo. Hay que entrar en el mercado, en sus tendencias, al menos hay menos riesgo. Y lo principal es seguir la posición hasta el posible beneficio y el cierre óptimo. :)
 

No se trata de estar triste, ni de los demás. La conclusión es que hay un error y el soporte no responde en absoluto. No se preocupan realmente por los clientes. Tengo mucha curiosidad por saberlo. La solicitud está pendiente desde hace casi una semana, y no hay ninguna reacción... No sé qué hacer con él... ¿Tal vez se pueda tomar un video y mostrar el precio en la barra actual y la tara la corta, pero no hay órdenes pendientes? Sí, lo hice, pero sólo lo hice para entender la razón. Lo pondré a prueba en la Demo el lunes, pero... Pero, de nuevo... si el probador es totalmente defectuoso, ¿de qué servirá?

 
hoz:

... Tal vez un video y mostrar cómo el precio va y en la barra actual, el alquitrán corta a través de la mach...

No tuve eso con el Machka.
 
tara:
No lo tuve con Mashka.


¿Qué Mashka?

Escribí específicamente en qué casos. ¿Por qué tratas de hacerlo sobre ti? Este hilo ya tiene 9 páginas, pero sigue ahí.

Adjunto el código. Aquí está el mismo código para verlo:

//+-----------------------------------------------------------------------------------+
//|                                                                       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;                           // Отступ от МА
extern double buyHear = 10,                                    // Расстояние от МА до отложки на бай
              SellHear = 10;                                   // Расстояние от МА до отложки на шорт
// Машечки
double fastMa,
       slowMa;
double pt;
datetime lastBarTime;                                          // Время проведения последних рассчётов
// Переменные рыночного окружения
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();
   
   lastBarTime = 0;
   
   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) * pt;
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * pt;
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE) * pt;
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
   int ticket = -1;
   double OOP = fastMa + buyHear * pt;             // Получаем значение цны открытия
   
   if ((ND(OOP) - Ask) >= MathMax(g_stopLevel,g_spread))             // Проверка цену открытия на стоплевел          
   {
       if (ND(OOP) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
   int ticket = -1;
   double OOP = fastMa - SellHear * pt;               // Получаем значение цны открытия
   
   if ((Bid - ND(OOP)) >= MathMax(g_stopLevel,g_spread))                // Проверка цену открытия на стоплевел
   {
       if (ND(OOP) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("fastMa + i_thresholdFromMa * pt = ", fastMa + i_thresholdFromMa * pt);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
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())             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell())           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
 //  if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
   //    return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)
       if ( ND(MathAbs(fastMa - Ask)) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
          return(SIGNAL_BUY);
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)
       if ( ND(MathAbs(fastMa - Bid)) <= 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_OPEN,0);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);
   
 /*  Print("Bid = ", Bid);
   Print("Ask = ", Ask);
   Print("fastMa = ", fastMa);
   Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
   */
// Отслеживание открытия нового бара
   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);
}

ALGUNOS BARES SON IGNORADOS DESCARADAMENTE SIN NINGUNA RAZÓN. Y por supuesto, no hay órdenes pendientes sobre ellos. El código es correcto. No hay nada que arreglar por lo que veo.

Aquí hay capturas de pantalla que muestran las posiciones que no se han abierto. Allí también se pueden ver las fechas de las pruebas. Por favor, ayúdenme a encontrar la razón. Ya he comentado todo en el hilo, pero no la pregunta original.

1

2

3

Archivos adjuntos:
test_ma_4.mq4  10 kb
 
pako:
Si no le importa formular de nuevo los TdR, ¿por qué necesita controlar un nuevo bar?



Lo diré en pocas palabras. Hay una cosa más en la que no he pensado, pero le daré todo el punto.

No debería haber ningún límite en el número de pedidos. Es decir, los pedidos pueden abrirse en cualquier cantidad... ... no importa cuántas tengamos, pero necesitamos que se abra sólo 1 orden en la barra actual. Eso es todo.

Es decir, se abre una nueva barra, por lo que podemos abrir 1 orden durante esta barra, pero no más de 1 orden en la barra actual. La siguiente orden sólo puede abrirse en la siguiente barra, no antes.

¿Está claro ahora?

Y aquí te equivocas...

//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_OPEN,0); <---------------- fastMa == slowMa 
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);  <--------------  fastMa == slowMa

   

¡Los periodos de las ondas son diferentes...i_fastMaPeriod yi_slowMaPeriod son 10 y 21 respectivamente!

 

Lecturas recomendadas

https://www.mql5.com/ru/articles/1411

 
hoz:


Yo lo hago y es fácil. No he pensado en 1 cosa más, pero te daré la idea completa.

No debería haber ningún límite en el número de pedidos. Es decir, los pedidos pueden abrirse en cualquier cantidad... No importa cuántas sean, pero sólo debe abrirse 1 orden en la barra actual. Eso es todo.

Es decir, se abre una nueva barra, por lo que podemos abrir 1 orden durante esta barra, pero no más de 1 orden en la barra actual. La siguiente orden sólo puede abrirse en la siguiente barra, no antes.

¿Está claro ahora?


Mantenga que en cada barra sólo se abre una posición

//+------------------------------------------------------------------+
//|                                                     черновик.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NewBar()==true)
       {
        int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-250*Point,Ask+250*Point," ",16384,0,Green); 
       }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar() 
    {

       static datetime LastTime = 0;

       if (iTime(NULL,0,0) != LastTime) 
       {
          LastTime = iTime(NULL,0,0);      
          return (true);
       } else
          return (false);
    }
 
pako:


mantener sólo una posición abierta en cada barra

No puedes hacer eso. Si no consigues una condición a la primera, toda la hora se irá al garete.
 
hoz:


¡Lo haré claro y fácil! Todavía no he pensado en 1 cosa más, pero te daré la idea completa.

No debería haber ningún límite en el número de pedidos. Es decir, los pedidos pueden abrirse en cualquier cantidad... No importa cuántas sean, pero sólo debe abrirse 1 orden en la barra actual. Eso es todo.

Es decir, se abre una nueva barra, por lo que podemos abrir 1 orden durante esta barra, pero no más de 1 orden en la barra actual. La siguiente orden sólo puede abrirse en la siguiente barra, no antes.


Así que, en este caso
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
Podemos abrir la orden en la barra actual sólo si está abierta, es decir, debemos mover esta línea en la función OpenBuy/Sell