[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 131

 

昨日質問したことについて、コードの一部を作り直しました。すべてが、あるべき姿になりました。以下は、私が書いているのはほんの序の口なので、元の信号を得るために使われているものを示すための3つの関数 です。

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

こちらが購入機能です。

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

これがそのセリフです。

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

ND(fastMa + i_thresholdFromMa * pt) 価格でポジションをオープンしていますが、全くオープンしていません。なぜ?

2日前から悩んでいる、どうしたらいいのかわからない。コード上では、すべて同じです。本番ではチェックを書いていない、今はテスターで書いている。

例えばこんな画面です。

Aジョイント

チャート上では、fastMa(赤)より高くはなく、全体的に低くなっていることがわかります。しかし、コード上では、保留中の注文が価格であるべきという条件が明示されています。

ND(fastMa + i_thresholdFromMa * pt)

プロフェッショナルの皆さん、いかがでしょうか?もうどうしたらいいのかわからない...。

 

こんにちは。インジケータをベースにインジケータを作成 したのですが、元のシグナル-シグナルインジケータはチャートに貼り付けると以前の全てのバーでその値を表示しますが(バー [1] から始まる全てのバーに適用されます)、そこから作成したインジケータ(バー [0] に適用)はチャートに貼り付けたときだけその値を表示し、その値は正しいですが以前のバーでは「空」ですので、どうしたら修正できるかご教示お願いします。

私のコード

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

ビクターさん、Asc+距離でポーズをかけ、条件でAscとMashkaの比率を指定すれば、思い通りになると思います。ぜひお試しください。

 
hoz:


チャート上では、fastMa(赤いリストバンド)の上ではなく、完全に下にあることがわかります。しかし、コード上では、一時停止は価格であることが条件と明示されています。

プロフェッショナルの皆さん、いかがでしょうか?もうどうしたらいいのかわからない...。

おそらく注文した時点では、MAは現在描かれているものよりも低い位置にあったのでしょう。0本目からではなく、1本目からMAA値を取るようにする。
 
borilunad:

ビクターさん、Asc+距離でポーズをかけ、条件でAscとMashkaの比率を指定すれば、思い通りになると思います。ぜひお試しください。


ボリス そういうことです。

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

そして、こちらがそのポジションの募集です。

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

すべて正しいようです。でも、やっぱりあるんです。

セプルカ
おそらく、発注した当時は、今描かれているよりもMAHAが低かったのでしょう。0小節目ではなく、1小節目から値を取ってみてください。


試してみたが、違いはない。戻したんだ...。私にとって重要なのは、今この時点で何が起こっているかであって、以前何が起こっていたかではないのです。

以下はスクリーンショットです(機械から受け取った値が0ではなく、1の場合)。

論理はどこにあるのか?

 

ビクター だから、最初に条件を書いておくと、全部が見えるから、論理的な間違いを見つけやすいんだ。特に、まだ十分な知識と経験がないときは、これから長い間、自分もその一人に数えられるだろう。プロは関数やファイル、ライブラリを簡単に操り、その知恵を徐々に身につけていったことを忘れているのではないだろうか。しかし、実践なくして理論を学ぶことはできませんし、それ以上に一人ひとりの性格に左右されることが多いのです。

 
hoz:


ボリス それは私がやったことだ。

そして、こちらがそのポジションのオープニングです。

すべてが正しいように思います。でも、まだあるんです。


試してみたが、違いはない。戻ったんだ...私にとって重要なのは、今この時点で何が起こっているかであって、以前何が起こった かではないのです。

以下はスクリーンショットです(機械から受け取った値が0ではなく、1の場合)。

最後に、あなたがやりたいことを具体的に教えてください...。例:MAA such-and-suchが上昇しており、MAA such-and-suchの上にあり、価格がMAA such-and-suchの上/下にあり、それが本当 であれば、その距離で保留注文を出します。大まかなアルゴリズムをお伝えします。なぜなら、コードの断片が文脈から切り離されていると、正しい方向に導くのが難しいからです。しかも、問題は小学5年生向け(大げさ)。


強調表示については、オープンプライスで作業すれば、ゼロバーでMACが再描画されるのを見ることはありません。

 
artmedia70:

...正しい方向を指し示すのは難しい...。

IMHOは、同志が教科書やドキュメントを勉強することを気にしない、小袋や棚との戦いにあまりにも熱心であるため、困難ではないが、非常に簡単に "指示 "や送信することができます。:-)

 
Roman.:

IMHO、難しくないが、非常に簡単に "指示 "または送信するために、同志が教科書や文書を勉強する気にしない、小袋や棚との戦いにあまりにも熱心であるため。:-)

男、落とし穴はほぼないですね・・・。奇跡は起きない。
だから、ある人がこの石で自分の周りを囲んで、石を動かしている、動かしている。
 
Sepulca:


ありがとうございました。まさに必要としていたものです。)
理由: