Um bug na função OrderSend() ? - página 9

 
borilunad:
Portanto, não há necessidade de definir uma proporção exata de cotonetes para barras. Você só pode considerar esfregaços com cotonetes e é melhor usá-los como filtros em vez de sinais.

Boris, Você está parcialmente certo. Basicamente, as luneta são um ponteiro. Mais uma vez, porém, há aqui algumas opções. Alguns estão procurando entrar em uma contra tendência e outros estão procurando seguir a tendência. Há muitas variações, mas elas ainda não funcionaram realmente :(
 
hoz:

Boris, você está parcialmente certo. Basicamente, os vagões são um ponteiro. Mais uma vez, no entanto, há uma série de opções aqui. Alguns procuram entrar em uma tendência contrária, outros entram em uma tendência... Há muitas variações, mas elas ainda não funcionaram como esperado :(
Não fique triste pelos outros! Procure o seu, e você o encontrará! Se você não sabe o que fazer, não pode fazê-lo, porque o preço não consegue acompanhá-lo. Você tem que entrar no mercado, suas tendências, pelo menos há menos riscos. E o principal é seguir a posição para o possível lucro e fechamento ideal. :)
 

A questão não é ser triste, nem para os outros. O resultado final é que há um bug e o suporte não está respondendo de forma alguma! Eles não se importam realmente com os clientes. Estou muito curioso sobre isso. O pedido está pendente há quase uma semana e não há nenhuma reação... Não sei o que fazer com ele... Talvez você possa pegar um vídeo e mostrar o preço na barra atual e os cortes de tara através dele, mas não há ordens pendentes... Sim, eu me apeguei a este momento, mas apenas para entender a razão. Na segunda-feira vou colocá-lo à prova na Demo, mas... Mas, novamente... se o testador é totalmente defeituoso, de que servirá?

 
hoz:

... Talvez um vídeo e mostrar como vai o preço e na barra atual, o alcatrão corta através da máquina...

Eu não tinha isso com o Machka.
 
tara:
Eu não tinha isto com Mashka.


Qual Mashka?

Eu escrevi especificamente em que casos. Por que você está tentando fazer isso a seu respeito? Esta linha já tem 9 páginas, mas ainda está lá.

Estou anexando o código. Aqui está o mesmo código para visualização:

//+-----------------------------------------------------------------------------------+
//|                                                                       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);
}

ALGUMAS BARRAS SÃO FLAGRANTEMENTE IGNORADAS SEM NENHUMA RAZÃO. E, é claro, não há ordens pendentes sobre eles. O código está correto. Até onde posso ver, não há nada para consertar.

Aqui estão as screenshots mostrando posições que não foram abertas. As datas dos testes também são visíveis ali. Por favor, ajude-me a encontrar a razão. Já discuti tudo o que estava na linha, mas não a questão original.

1

2

3

Arquivos anexados:
test_ma_4.mq4  10 kb
 
pako:
Se você não se importa de formular o ToR novamente, por que você precisa controlar um novo bar?



Vou resumir! Há mais uma coisa em que ainda não pensei, mas vou lhe dar a idéia completa.

Não deve haver nenhum limite para o número de pedidos. Ou seja, as ordens podem ser abertas em qualquer quantidade. ... não importa quantos temos, mas precisamos apenas de 1 ordem para sermos abertos no bar atual. É isso aí.

Ou seja, um novo bar se abre, de modo que podemos abrir 1 ordem durante este bar, mas não mais que 1 ordem no bar atual. O próximo pedido pode ser aberto somente no próximo bar, não mais cedo.

Isso está claro agora?

E aqui você está errado...

//+-------------------------------------------------------------------------------------+
//| Функция 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

   

Os períodos das ondas são diferentes...i_fastMaPeriod ei_slowMaPeriod são 10 e 21 respectivamente!

 

Leitura recomendada

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

 
hoz:


Eu faço e é fácil! Não pensei em mais uma coisa, mas vou lhe dar a idéia completa.

Não deve haver nenhum limite para o número de pedidos. Isto é, as encomendas podem ser abertas em qualquer quantidade. Não importa quantos são, mas apenas 1 ordem deve ser aberta no bar atual. É isso aí.

Ou seja, um novo bar se abre, de modo que podemos abrir 1 ordem durante este bar, mas não mais que 1 ordem no bar atual. O próximo pedido pode ser aberto somente no próximo bar, não mais cedo.

Isso está claro agora?


Mantenha que em cada barra somente uma posição é aberta

//+------------------------------------------------------------------+
//|                                                     черновик.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:


manter apenas uma posição aberta em cada bar

Você não pode fazer isso. Se você não conseguir uma condição no primeiro tique, a hora inteira irá para o desperdício.
 
hoz:


Vou deixar isso claro e fácil! Ainda não pensei em mais uma coisa, mas vou lhe dar a idéia completa.

Não deve haver nenhum limite para o número de pedidos. Isto é, as encomendas podem ser abertas em qualquer quantidade. Não importa quantos são, mas apenas 1 ordem deve ser aberta no bar atual. É isso aí.

Ou seja, um novo bar se abre, de modo que podemos abrir 1 ordem durante este bar, mas não mais que 1 ordem no bar atual. O próximo pedido só pode ser aberto no próximo bar, não antes.


Então, neste caso
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
Podemos abrir a ordem na barra atual somente se ela for aberta. ou seja, devemos mover esta linha na função OpenBuy/Sell