[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 331

 

またバッファで何か失敗したんでしょうね。ぜひご覧ください。

タスクは以下の通りです。

1) LSMAを算出する。i]>[i+1]の場合、色は緑、[i]<[i+1]の場合、色は赤になります。これさえあれば、すべてがクリアできる。

2) 緑と赤の値の系列の長さを求め、配列に格納する必要があります。これは、まだ自分で解決できていない問題です。

//+------------------------------------------------------------------+
//|                                                   LSMA_Stat2.mq4 |
//|                                                       silhouette |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "silhouette"
#property link      "http://www.metaquotes.net"

#property copyright "silhouette"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
//+------------------------------------------------------------------+
double BufferYellow[],BufferGreen[], BufferRed[];
int GreenSeries[], RedSeries[], g=0, r=0, gc=0, rc=0;
string Symb;

int init()
  {
   Symb=Symbol();
   
   SetIndexBuffer(0,BufferYellow);
   SetIndexBuffer(1,BufferGreen);
   SetIndexBuffer(2,BufferRed);
   
   SetIndexStyle(0,DRAW_LINE,EMPTY,2);
   SetIndexStyle(1,DRAW_LINE,EMPTY,2);
   SetIndexStyle(2,DRAW_LINE,EMPTY,2);  
   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
   double tmp1, tmp2, LSMA;
   
   int counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;
   if (limit>1) 
      limit=Bars-1;
      
   for(int i=limit; i>0; i--)
    {
     tmp1=iMA(Symb,Period(),34,0,MODE_SMA,0,i);
     tmp2=iMA(Symb,Period(),34,0,MODE_LWMA,0,i);
     LSMA=3.0*tmp2-2.0*tmp1;
      
     BufferYellow[i]=LSMA;
     BufferGreen[i]=LSMA;
     BufferRed[i]=LSMA;

     if(BufferYellow[i]>BufferYellow[i+1])
      {
       BufferRed[i]=EMPTY_VALUE;
      }
     else if(BufferYellow[i]<BufferYellow[i+1])
      {
       BufferGreen[i]=EMPTY_VALUE;
      }
     else
      {
       BufferRed[i]=EMPTY_VALUE;
       BufferGreen[i]=EMPTY_VALUE;
      }                        
      
     if(BufferGreen[i]!=EMPTY_VALUE && BufferRed[i]==EMPTY_VALUE)
      {
       g++;
      }
     if(BufferGreen[i]==EMPTY_VALUE && BufferRed[i]!=EMPTY_VALUE)
      {
       r++;
      }
     if(BufferGreen[i]==EMPTY_VALUE && BufferRed[i]==EMPTY_VALUE)
      {
       if(BufferGreen[i+1]!=EMPTY_VALUE)
        {
         GreenSeries[gc]=g;
         gc++;
         g=0;
        }
       if(BufferRed[i+1]!=EMPTY_VALUE)
        {
         RedSeries[rc]=r;
         rc++;
         r=0;
        }
      }              
    }
   return(0);
  }
 
silhouette:

またバッファで何か失敗したのでしょう。ぜひご覧ください。

タスクは以下の通りです。

1) LSMAを算出する。i]>[i+1]の場合、色は緑、[i]<[i+1]の場合、色は赤になります。これさえあれば、すべてがクリアできる。

2) 緑と赤の値の系列の長さを求め、配列に格納する必要があります。これは、まだ自分で解決できていない問題です。


この インジケーターのどこが悪いのか
 
Vinin:

なぜこの インジケーターが気に入らないのか?

Vininさん、実はサンプル通りにやってみたのですが、ポイントは違っていて、私にとって重要なのは計算方法そのものではなく(最もシンプルなMAであっても)、ポイント2の問題解決なのです。

さらなる解析のために、緑または赤の系列の長さを格納する配列を取得する必要があります。

 
アドバイスをお願いします。仮想的な2つの残高グラフ(売り注文用と買い注文用)があり、現実にはそれらが大きく乖離することがあります。このグラフが交差する瞬間を計るには、どのような相対的な単位に変換すればよいのだろうか。
 
silhouette:

Vininさん、実はあなたのサンプル通りにやってみたのですが、ポイントは違います。私にとって重要なのは計算方法そのものではなく(最もシンプルなMAであっても)、ポイント2の問題の解決策なのです。

さらなる解析のために、緑または赤の系列の長さを格納する配列を取得する必要があります。


なぜ配列が必要なのですか?
 
Vinin:

なぜ配列が必要なのですか?
その後の統計解析のために。例えばExcelの場合。
 

マウストレーディング用のライブラリがあります https://www.mql5.com/ru/code/9671

全く接続できないのですが、助けてください。

エキスパートフォルダに必要なファイルをすべてダウンロードしてからコンパイルしても、インジケータにはデータのない黒いウィンドウが表示されたままです。

明らかに幼稚なミスだが、24時間見つからない。


 
TheXpert:

何もフォルダ分けする必要はありません。アーカイブにはすでにすべてのファイルが含まれていますので、あとはアーカイブを端末のフォルダに解凍してコンパイルするだけです。

インジケータファイルのみコンパイルされ、ライブラリ(mqh)はコンパイルされる必要はありません。新しい端子をつけて練習してみてください。

 

ヒントを教えてください。ターミナルに「MQL4.community」というボタンがあり、それをクリックするとWordが開いて該当ページが表示されるのですが、何かリンクをクリックしようとすると、「私のコンピュータには制限があります」というウィンドウがポップアップしてきます???

どのように対処しているのですか?ありがとうございます。

 
void start()
  {
  double tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);
  double profitbuy, profitsell;
  
  for(int i = OrdersTotal()-1; i >= 0;i--)
    {
    if(!OrderSelect(i,SELECT_BY_POS)) continue;
    if(OrderSymbol()!=Symbol() || OrderType() >= 2) continue;
    if(OrderType() == 0)
      profitbuy +=((Bid - OrderOpenPrice())/Point*tickvalue*OrderLots())+OrderCommission()+OrderSwap();
    if(OrderType() == 1)
      profitsell+=((OrderOpenPrice() - Ask)/Point*tickvalue*OrderLots())+OrderCommission()+OrderSwap();
    }
  
  Comment(profitbuy+profitsell);
  }
В чем прикол, не могу правильно рассчитать суммарный профит для всех ордеров по одной паре, в терминале пишет одно, а у меня получается другое?

Итак, мои домыслы, своп в терминале нужно нормализовать обязательно, там точность больше двух бывает - это проверил, но как нормализовать - для каждого ордера или суммарно? Непонятно в общем...
Я уже всяко перепробовал, минимальная разница доходила до 0.02 центов, но это все равно не то, что нужно.

Вопрос, как мне мой код подогнать под работу функции - AccountProfit()?