どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 11

 
AndEv:
こんにちは。座標(x1,y1)と(x2,y2)の2点が存在する。この2点を使って、自然対数以外の対数基底を持つ対数関数を構成するにはどうしたらよいでしょうか?逆関数()を使う必要があるようですが、対角線にする方法がわかりません。この問題に直面したことのある方がいらっしゃいましたら、アドバイスをお願いします。事前に感謝しています。

簡単、対数の底で割ればいいのです。つまり、次数2の対数xが欲しければ、対数xを対数2で割れば、次数2の対数xが 得られるのである。
[Deleted]  
gyfto:

簡単、対数の底で割ればいいのです。つまり、次数2の対数xが欲しければ、対数xを対数2で割れば、次数2の対数xが 得られるのである。
よくわからないんです。私が言いたかったのは、MT4の常用対数関数は数値の自然対数しか 計算しないということです。MT4には、他に対数関数がありません。逆関数、つまりMathPowを使うこともできますが、対角線にミラーリングする必要があります。これ以上、簡単な方法はないと思うんです。
 
Fox_RM:

市場価格でないとはどういう意味ですか?SELLLIMITとBUYLIMITでは、すべてが正しくなります。

編集エリアに行って、保留中の注文とは 何かを読めば...すべての疑問は解消されるでしょう。
 
hoz:

編集で、保留中の注文が何なのか読んでみてください...そうすれば、すべての疑問が解消されるでしょう。


売り指 値は上限のボーダーから売り、買い指値は下限のボーダーから買います。すべて

保留で正解、そんなの関係ない。

 
コード内の注文は全て成行注文です
 
AndEv:
よくわからないんです。私が言いたかったのは、MT4の通常の対数関数は、数値の自然対数しか計算しないということです。MT4には、他に対数関数がありません。逆関数、つまりMathPowを使うこともできますが、対角線にミラーリングする必要があります。これ以上、簡単な方法はないと思います。 。


これのこと?

べき乗関数の逆関数は、同じ基数の対数関数である。目的の基底a 上の対数関数を得るには、MathLog(x)をMathLog(a)で割る必要があります。

[Deleted]  
gyfto:


これのこと?

べき乗関数の逆関数は、同じ基数の対数関数である。目的の基底a の対数関数を得るには、MathLog(x) を MathLog(a) で割ればよい。

はい、今わかりました、ありがとうございます。
削除済み  
hoz:
だいたいこんな感じです。


何か、間違っているような...。

こんな感じでしたね。

int start()                         
  {
   int i, Counted_bars;  
//--------------------------------------------------------------------
   CurrentPoint1 = 0;
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
   Counted_bars=IndicatorCounted(); 
   i=Bars-Counted_bars-1;           
   while(i>=0)                     
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }


こんな感じでした。

int start()                         
  {
    int i, countedBars = IndicatorCounted();
        
    for(i = Bars - countedBars;i > 0;i--)    
//--------------------------------------------------------------------
   CurrentPoint1 = 0; 
   CurrentPoint2 = 0; 
   kVol1=MarketInfo(Symbol_1, MODE_TICKVALUE)/MarketInfo(Symbol_1, MODE_TICKSIZE);
   kVol2=MarketInfo(Symbol_2, MODE_TICKVALUE)/MarketInfo(Symbol_2, MODE_TICKSIZE);
             
   while(i>=0)                 
     {
      Symbol1_Buf[i] = MACD (Symbol_1, iBarShift(Symbol_1, 0, Time[i], FALSE));
      if(Revers) Symbol2_Buf[i] = -1*MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      else Symbol2_Buf[i] = MACD (Symbol_2, iBarShift(Symbol_2, 0, Time[i], FALSE));
      
      if((Symbol1_Buf[i+1]>Symbol2_Buf[i+1] && Symbol1_Buf[i+2]<=Symbol2_Buf[i+2]) ||
         (Symbol1_Buf[i+1]<Symbol2_Buf[i+1] && Symbol1_Buf[i+2]>=Symbol2_Buf[i+2]))
         {
          CurrentPoint1 = 0;
          CurrentPoint2 = 0;
          ZeroClose1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i+1]));
          ZeroClose2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i+1]));         
         }
      
      CurrentPoint1 = iClose(Symbol_1,Period(),iBarShift(Symbol_1,0,Time[i])) - ZeroClose1;
      if(Revers) CurrentPoint2 = -1*(iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2);
      else CurrentPoint2 = iClose(Symbol_2,Period(),iBarShift(Symbol_2,0,Time[i])) - ZeroClose2;

      Spread_Buf[i]  = (CurrentPoint1 / MarketInfo(Symbol_1, MODE_POINT) - CurrentPoint2 / MarketInfo(Symbol_2, MODE_POINT));
                              
      Buf_Up[i] = Spread_Buf[i];     
      Buf_Dw[i] = Spread_Buf[i];  
      if(Spread_Buf[i] < Spread_Buf[i+1]) Buf_Up[i] = EMPTY_VALUE;
      if(Spread_Buf[i] > Spread_Buf[i+1]) Buf_Dw[i] = EMPTY_VALUE; 
      i--;                          
     }

コンパイル後、エラーは出ませんが、インジケータには長いバーが1本だけ表示されます。

 
Krokus:

コンパイル後、エラーはありませんが、インジケータには長いバーが1本だけ表示されます。


私はあなたのインジケータのロジックを理解する時間がありませんが、私は正しくループを設定する方法を書きました。

ちなみに、コードを簡略化して読みやすくするのも有効です。この場合、分析がしやすいと思います。これがエラーの原因であることが多い。読みやすいコード、よく考えられた変数名であればあるほどよい。

削除済み  
hoz:


さて、まだあなたのインジケータのロジックを調べる時間がないのですが、ループを正しく設定する方法を書きました。

ところで、コードを簡略化して読みやすくしても損はないでしょう。そうすれば、分析もしやすくなりますしね。これがエラーの原因であることが多い。コードは読みやすいほうがいいし、変数の名前もいいほうがいい。


調べてみます。ありがとうございます。