OrderSend()関数のバグ? - ページ 9

 
borilunad:
そのため、スワブとバーの比率を厳密に設定する必要はありません。スワブはスワブで考えるしかなく、信号というよりフィルターとして使うのがよいでしょう。

ボリス おっしゃるとおりです。基本的にベゼルはポインターです。ここでも、いくつかの選択肢があるのですが。カウンタートレンドへの参入を目指す人もいれば、トレンドフォローを目指す人もいる。いろいろなバリエーションがあるのですが、まだうまくいっていないんです :(
 
hoz:

ボリス その通りな部分もありますね。基本的に、ワゴンはポインターです。ここでも、いくつかの選択肢があるのですが。ある人はカウンタートレンドに、ある人はトレンドに...。いろいろなバリエーションがあるのですが、まだ期待通りにはいきません :(
人のために悲しまないでください自分自身を探せば、きっと見つかるはずです何をすればいいのかわからないと、価格が追いつかないのでできない。市場、そのトレンドに参入しなければならないが、少なくともリスクは少ない。そして、主なものは、可能な利益と最適なクロージングまでポジションを追いかけることです。:)
 

ポイントは、悲しむことでもなく、他者への配慮でもない。 要はバグがあるのに、サポートが全く対応してくれないということですお客さんのことを本当に考えていないのか。 とても気になるところです。依頼から1週間近く経過しているが、全く反応がない...。私はそれをどうすればよいのかわからない... もしかしたら、ビデオを撮って、現在のバーの価格を表示し、風袋はそれを右にカットしますが、保留中の注文はないのでしょうか?はい、やりましたが、あくまで理由を理解するためにやりました。月曜日にDemoでテストしてみますが、、。しかし、それにしても...テスターが全く不具合であれば、何の意味もないのでは?

 
hoz:

...動画で価格の推移を見せるとか、今のバーではタールがマッハで切れるとか......。

マッハカではそれがなかったんです。
 
tara:
マシュカにはなかった。


どのマシュカ?

具体的にどのような場合にそうなるのか、書きました。なぜ、自分のことにしようとするのか?このスレはもう9ページ目だけど、まだあるんだ。

コードを添付します。以下は、閲覧用の同じコードです。

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

理由もなく露骨に無視されるバーもある。 もちろん、保留中の注文もない。コードは正しいです。私が見る限り、直すべきところは何もありません。

未開放のポジションを示すスクリーンショットです。テストの日程もそこで確認できます。原因究明をお願いします。私はすでにこのスレッドですべてのことを議論していますが、元の質問ではありません。

1

2

3

ファイル:
test_ma_4.mq4  10 kb
 
pako:
またToRを策定するのは構わないとして、なぜ新しいバーを制御する必要があるのか、



一言で言うと!?もうひとつ、考えてもみなかったことがあるのですが、それは全体のポイントをお伝えします。

注文数の 制限を一切設けないこと。つまり、注文は何度でも開けることができる...。...いくつあってもいいのですが、現在のバーで開く注文は1つだけでいいのです。それだけです。

つまり、新しいバーが開くので、このバー中に1つの注文を出すことができますが、現在のバーには1つ以上の注文を出すことはできません。次の注文は、次のバーでのみ開くことができ、それ以前には開きません。

もうお分かりですか?

そして、ここであなたは間違っている...

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

   

波の周期が違う...i_fastMaPeriodが10、i_slowMaPeriodが21です!?

 

推薦図書

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

 
hoz:


私はそうしていますし、簡単ですあと1つも考えていないのですが、全体のイメージをお伝えします。

注文数の制限を一切設けないこと。I.e.注文は任意の数で開くことができる...何本あっても構いませんが、現在のバーで開く注文は1本だけにしてください。それだけです。

つまり、新しいバーが開くので、このバー中に1つの注文を開くことができますが、現在のバーでは1つ以上の注文を開くことはできません。次の注文は、次のバーでのみ開くことができ、それ以前には開きません。

もうお分かりですか?


各バーで1つだけポジションを開くようにします。

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


一本取る

そんなの無理だよ。最初の刻みで条件を出さないと、1時間が無駄になってしまいます。
 
hoz:


わかりやすく、簡単にします!あと1つも考えていないのですが、全体のイメージをお伝えします。

注文数の制限を一切設けないこと。つまり、注文は何度でも開けることができる...。何本あっても構いませんが、現在のバーで開く注文は1本だけにしてください。それだけです。

つまり、新しいバーが開くので、このバー中に1つの注文を開くことができますが、現在のバーでは1つ以上の注文を開くことはできません。次の注文は、次のバーで開くことができ、それ以前にはできません。


だから、この場合
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
現在のバーが開いている場合にのみ、注文を開くことができます。つまり、関数OpenBuy/Sellの中でこの行を移動させる必要があります。