Ein Fehler in der Funktion OrderSend() ? - Seite 9

 
borilunad:
Daher ist es nicht erforderlich, ein genaues Verhältnis von Abstrichen zu Stäben festzulegen. Abstriche können nur mit Abstrichen berücksichtigt werden, und es ist besser, sie als Filter und nicht als Signale zu verwenden.

Boris, Sie haben teilweise Recht. Im Grunde sind die Einfassungen ein Zeiger. Aber auch hier gibt es einige Möglichkeiten. Einige wollen in einen Gegentrend einsteigen, andere wollen dem Trend folgen. Es gibt viele Varianten, aber sie haben bisher nicht wirklich funktioniert :(
 
hoz:

Boris, du hast teilweise Recht. Im Grunde genommen sind die Wagen ein Zeiger. Aber auch hier gibt es eine Reihe von Möglichkeiten. Die einen wollen in einen Gegentrend einsteigen, die anderen in einen Trend... Es gibt viele Varianten, aber sie haben noch nicht wie erwartet funktioniert :(
Sei nicht traurig für andere! Suchen Sie Ihr eigenes, und Sie werden es finden! Wenn man nicht weiß, was man tun soll, kann man es nicht tun, weil der Preis nicht mithalten kann. Man muss sich auf den Markt und seine Trends einlassen, zumindest ist das Risiko geringer. Und die Hauptsache ist, dass man die Position bis zum möglichen Gewinn und zur optimalen Schließung verfolgt. :)
 

Es geht nicht darum, traurig zu sein, und es geht auch nicht um andere. Die Quintessenz ist, dass es einen Fehler gibt und dass der Support überhaupt nicht antwortet! Die Kunden sind ihnen nicht wirklich wichtig. Ich bin sehr neugierig darauf. Der Antrag liegt seit fast einer Woche vor, und es gibt keinerlei Reaktion... Ich weiß nicht, was ich damit machen soll... Vielleicht können Sie ein Video aufnehmen und den Preis auf dem aktuellen Balken zeigen und die Tara schneidet direkt durch ihn hindurch, aber es gibt keine ausstehenden Aufträge? Ja, ich habe an diesem Moment festgehalten, aber nur, um den Grund zu verstehen. Ich werde es am Montag auf der Demo testen, aber... Aber andererseits... wenn das Testgerät völlig fehlerhaft ist, wozu soll es dann gut sein?

 
hoz:

... Vielleicht ein Video und zeigen, wie der Preis geht und auf der aktuellen Bar, schneidet der Teer durch die mach...

Das hatte ich bei der Machka nicht.
 
tara:
Bei Mashka hatte ich das nicht.


Welche Mashka?

Ich habe ausdrücklich geschrieben, in welchen Fällen. Warum versuchen Sie, die Sache auf sich zu beziehen? Dieser Thread ist bereits 9 Seiten lang, aber er ist immer noch da.

Ich hänge den Code an. Hier ist der gleiche Code zur Ansicht:

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

EINIGE BALKEN WERDEN GRUNDLOS IGNORIERT. Und natürlich gibt es bei ihnen keine offenen Aufträge. Der Code ist korrekt. Soweit ich sehen kann, gibt es nichts zu reparieren.

Hier sehen Sie Screenshots von Positionen, die nicht geöffnet wurden. Dort sind auch die Prüfungstermine zu sehen. Bitte helfen Sie mir, den Grund zu finden. Ich habe bereits alles in diesem Thema besprochen, aber nicht die ursprüngliche Frage.

1

2

3

Dateien:
test_ma_4.mq4  10 kb
 
pako:
Wenn es Ihnen nichts ausmacht, die ToR neu zu formulieren, warum müssen Sie dann eine neue Leiste kontrollieren?



Ich bringe es auf den Punkt! Es gibt noch eine Sache, an die ich nicht gedacht habe, aber ich werde Ihnen den ganzen Punkt nennen.

Die Anzahl der Aufträge sollte nicht begrenzt sein. D.h., die Aufträge können in beliebiger Menge eröffnet werden... ... es spielt keine Rolle, wie viele wir haben, aber wir brauchen nur 1 Auftrag, der in der aktuellen Leiste geöffnet wird. Das war's.

D.h., es wird ein neuer Balken eröffnet, so dass wir in diesem Balken 1 Auftrag eröffnen können, aber nicht mehr als 1 Auftrag im aktuellen Balken. Der nächste Auftrag kann nur zum nächsten Takt eröffnet werden, nicht früher.

Ist das jetzt klar?

Und hier liegen Sie falsch...

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

   

Die Wellenperioden sind unterschiedlich...i_fastMaPeriod undi_slowMaPeriod sind 10 bzw. 21!

 

Empfohlene Lektüre

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

 
hoz:


Ich tue es und es ist einfach! Ich habe nicht an eine weitere Sache gedacht, aber ich werde Ihnen die ganze Idee geben.

Die Anzahl der Aufträge sollte nicht begrenzt sein. D.h. es können Aufträge in beliebiger Menge eröffnet werden... Es spielt keine Rolle, wie viele es sind, aber es sollte nur 1 Auftrag in der aktuellen Leiste geöffnet werden. Das war's.

D.h., es wird ein neuer Balken eröffnet, so dass wir in diesem Balken 1 Auftrag eröffnen können, aber nicht mehr als 1 Auftrag im aktuellen Balken. Der nächste Auftrag kann nur zum nächsten Takt eröffnet werden, nicht früher.

Ist das jetzt klar?


Beachten Sie, dass bei jedem Takt nur eine Position geöffnet wird.

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


nur eine Position auf jedem Balken offen halten

Das können Sie nicht tun. Wenn Sie nicht auf Anhieb eine Bedingung erfüllen, ist die ganze Stunde umsonst gewesen.
 
hoz:


Ich werde es klar und einfach machen! Ich habe noch nicht an eine weitere Sache gedacht, aber ich werde Ihnen die ganze Idee geben.

Die Anzahl der Aufträge sollte nicht begrenzt sein. D.h. es können Aufträge in beliebiger Menge eröffnet werden... Es spielt keine Rolle, wie viele es sind, aber es sollte nur 1 Auftrag in der aktuellen Leiste geöffnet werden. Das war's.

D.h., es wird ein neuer Balken eröffnet, so dass wir in diesem Balken 1 Auftrag eröffnen können, aber nicht mehr als 1 Auftrag im aktuellen Balken. Der nächste Auftrag kann erst im nächsten Takt eröffnet werden, nicht vorher.


In diesem Fall also
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
Wir können die Order nur dann für den aktuellen Balken öffnen, wenn dieser geöffnet ist, d.h. wir sollten diese Zeile in der Funktion OpenBuy/Sell verschieben