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

 
gyfto:

専門家のためにチックを整理しようとしたが、うまくいかなかった。週末は驚きの連続でした。正しい整理の仕方とは?例えば、以下のような初歩的なExpert Advisorがあります。

- ティックをシミュレートしてタイマーをスタートさせるには?

週末というのはわかるのですが、市場では休日のスケジュールがRFのものと一致せず、やはり仕事をしなければならないので...。

図書館

 //=================================================================================================================================================
 // 4.7. Функции для управления обновлением графика.
 //=================================================================================================================================================
 // 4.7.1. Функция запускает обновление всех графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshAllCharts(int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.2. Функция запускает обновление всех графиков однократно. Вызов функции при работающих других режимах останавливает обновление всех графиков.
 void ServiceRefreshAllOnceCharts();
 //=================================================================================================================================================
 // 4.7.3. Функция запускает обновление указанного графика с указанным периодом. Если обновление уже запущено, то функция меняет только период обновления графика.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshChart(int hwndChart,        // Системный дескриптор обновляемого графика.
                          int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.4. Функция запускает обновление автономных графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshOfflineCharts(int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.5. Функция запускает обновление online-графиков с указанным периодом. Если обновление уже запущено, то функция меняет период обновления графиков.
 //        Останавливается обновление функциями "ServiceStopRefreshChart()" или "ServiceStopRefreshAllCharts()" или закрытием графика.
 void ServiceRefreshOnlineCharts(int nPeriodMilliSec); // Период обновления графика в миллисекундах.
 //=================================================================================================================================================
 // 4.7.6. Функция останавливает обновление указанного графика.
 void ServiceStopRefreshChart(int hwndChart); // Системный дескриптор графика, на котором останавливается обновление.
 //=================================================================================================================================================
 // 4.7.7. Функция корректно останавливает обновление всех графиков при bTerminate = FALSE, иначе функция завершает обновление аварийно.
 void ServiceStopRefreshAllCharts(int bTerminate); // Флаг аварийной остановки потоков обновления графиков.
                                                   // FALSE - потоки останавливаются корректно, TRUE - потоки останавливаются аварийно.
 //=================================================================================================================================================
 // 4.7.8. Функция эммулирует тик для эксперта на указанном графике.
 void ServiceTickExpert(int hwndChart); // Системный дескриптор окна графика, для эмуляции тика для эксперта.
 //=================================================================================================================================================
 // 4.7.9. Функция эммулирует тик для индикаторов на указанном графике.
 void ServiceTickIndicators(int hwndChart); // Системный дескриптор окна графика, для эмуляции тика для индикаторов.
 //=================================================================================================================================================
 
Zhunko:

図書館


フォーラムに問い合わせる前に使おうとしたのはServiceTickExpert()でした。テストエキスパートの実行を試みました

#import "ServicesMT4.dll"
   void ServiceTickExpert(int hwndChart);
   void ServiceRefreshChart(int hwndChart, int nPeriodMilliSec);
#import
int delay = 180;
datetime read_now;
int init(){
   read_now = TimeCurrent() + delay;
}
int start(){
   int hWnd = WindowHandle(Symbol(), Period());
   ServiceTickExpert(hWnd);
   ServiceRefreshChart(hWnd, 500);
   int how_many_remains = read_now - TimeCurrent();
   Comment(StringConcatenate(
      StringSubstr("-", (how_many_remains%60 >= 0), 0),
      StringSubstr("0", (MathAbs(how_many_remains/60) > 9), 0),
      MathAbs(how_many_remains/60),
      ":",
      StringSubstr("0", (MathAbs(how_many_remains%60) > 9), 0),
      MathAbs(how_many_remains%60)
   ));
   return(0);
}

- しかし、沈黙。

 
Link_x:
主に表示されることです。:)そうすれば、禁じられた価値観は消え去りますが、問題は残ります。


問題はこの行にあると思うんです。

R_time        = Seconds() * Minute() * Hour(); 

すべての値は同じ時間、正確には現在のサーバー時間、つまり最終既知の時間が掛けられます。

また、bool型の変数がdoubleであるべきところをdoubleで宣言していたり、その他にも小さなバグがいくつかあります。プライマーはまだ完全に飽きていないようです ))))

#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Gold
#property  indicator_color2 Gold
#property  indicator_color3 Gold
//+---------------------------------------------------------------------+
extern double _N_ = 1; 
extern double _M_ = -1; 
extern int History = 10000; //многовато, а вдруг столько на графике нету? Проверка нужна...
//+---------------------------------------------------------------------+
int p; 
//+---------------------------------------------------------------------+
double Buf_0[];
double Buf_1[];
double Buf_2[];
double RSI;
double ADX_Main; 
double ADX_dD;
double ADX_DD;
double price;
//+---------------------------------------------------------------------+  5 переменных ниже были обьявлены как bool, непонятно только с какого перепугу
double R_adx; 
double R_time;
double R_adx_time;
double R_rsi_time;
double R_rrsi_time;
//+---------------------------------------------------------------------+
int init()
{
//+---------------------------------------------------------------------+  
SetIndexBuffer(0,Buf_0);
SetIndexStyle(0,DRAW_LINE);
//+---------------------------------------------------------------------+  
SetIndexBuffer(1,Buf_1);
SetIndexStyle(1,DRAW_LINE);
//+---------------------------------------------------------------------+  
SetIndexBuffer(2,Buf_2);
SetIndexStyle(2,DRAW_LINE);
//+---------------------------------------------------------------------+  
return(0);
}
//+---------------------------------------------------------------------+
int start()
{
//+---------------------------------------------------------------------+  
for(
p=0;
p<History;
p++)
{
//+---------------------------------------------------------------------+  
//price = Bid;
//+---------------------------------------------------------------------+  
ADX_Main    = iADX(Symbol(),0,14,0,0,p);
ADX_dD      = iADX(Symbol(),0,14,0,1,p);
ADX_DD      = iADX(Symbol(),0,14,0,2,p);
RSI         = iRSI(Symbol(),0,14,0,p);
//+---------------------------------------------------------------------+  
R_adx         = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time1        = TimeToString(Time[p],TIME_SECONDS); //Время отркытия свечи р
R_time        = StringToDouble(R_time1); 
//+---------------------------------------------------------------------+  
R_adx_time    = _N_ * (R_time + R_adx);
R_rsi_time    = _N_ * (R_time + RSI);
R_rrsi_time   = _M_ * (R_time + RSI);
//+---------------------------------------------------------------------+  
Buf_0[p] = R_adx_time;
Buf_1[p] = R_rsi_time;
Buf_2[p] = R_rrsi_time;
//+---------------------------------------------------------------------+  
}
return(0); //эта строка была чуть  выше чем надо :)
}
//+-------------------
 
evillive:

問題はこの行にあると思うんです。

すべての値には同じ時間、つまり現在のサーバー時間、より正確には最後に確認された時間が掛けられます。

また、bool型の変数がdoubleであるべきところをdoubleで宣言していたり、その他にも小さなバグがいくつかあります。プライマーはまだ完全に飽きていないようです ))))


あ、ありがとうございます!
ミスや不具合もわかる。
どうやったらそんなことが打てるのか、想像がつかない?:)

インジケーターが想像もつかないような絵を描いていることに気づきました。
コードの "ボディ "に少し手を入れました。
R_adx           = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time_1 = TimeToStr(Time[p],TIME_SECONDS);
R_time          = StrToDouble(R_time_1); 
string T_time_1 = TimeToStr(Time[p],TIME_MINUTES);
T_time          = StrToDouble(T_time_1);
string B_time_1 = TimeToStr(Time[p],TIME_DATE);
B_time          = StrToDouble(B_time_1);
A_time          = R_time * T_time * B_time;
どちらかというと、想像していたものに近いですね。
しかし、「時間の波」は「価格の波」を完全に減衰させる。価格の波」を強くし、「時間の波」を弱くする。
R_rsi_time    = _N_ * (A_time + (RSI * 2000)) / 1.9;
A_time          = R_time * T_time * B_time / 4;
R_adx           = ((ADX_DD - ADX_dD) * ADX_Main) * 40; 
 
gyfto:


フォーラムに問い合わせる前に使おうとしたのはServiceTickExpert()でした。テストエキスパートの実行を試みました

- が、無音です。

ワーキングコードではありません。でも、例のスクリプトを見ればわかるかも?

チャートの更新方法は3つあります。

1.Expert Advisorのスタートで無限ループをアレンジする。Expert Advisor は、初期プログラムまたはリモートプログラムからのシングル起動が必要です。
2.別のスレッドから更新を開始そうすると、すべてのExpert Advisorがそのコードに関係なく実行されます。

3.ポイント2と同様ですが、システムタイマーの 力を借ります。

最初の2つはライブラリに実装されています。あなたのコードでは、Expert Advisorのチャート更新またはループのサイクルを独自にアレンジする必要があります。最初のケースでは、ループしたスクリプトが必要です。2つ目のケースでは、Expert Advisorを一度起動する必要があります。

そのセクション(4.7)の最初の7つの関数は、リフレッシュを整理し、独立したチャートのリフレッシュを別のスレッドで管理します。一度の起動と解除が可能です。MQLプログラムがなくても、チャートは更新され続けます。

#include <ServicesMT4.mqh>

int delay = 180;
datetime read_now;
int hWnd = 0;

void init()
 {
  read_now = TimeCurrent() + delay;
  hWnd = WindowHandle(Symbol(), Period());
  ServiceRefreshChart(hWnd, 500);
 }
void deinit()
 {
  ServiceStopRefreshChart(hWnd);
 }
void start()
 {
  int how_many_remains = TimeLocal() - read_now;
  Comment(StringConcatenate(StringSubstr("-", (how_many_remains%60 >= 0), 0),
                            StringSubstr("0", (MathAbs(how_many_remains/60) > 9), 0),
                            MathAbs(how_many_remains/60), ":",
                            StringSubstr("0", (MathAbs(how_many_remains%60) > 9), 0),
                            MathAbs(how_many_remains%60)));
 }
 
Link_x:

あ、ありがとうございます!
ミスや不具合もわかる。
どうやったらそんなことが打てるのか、想像がつかない?:)

インジケーターが想像もつかないような絵を描いていることに気づきました。
コードの "本体 "に少し手を入れました。
どちらかというと、想像していたものに近いですね。
しかし、「時間の波」は「価格の波」を完全に減衰させる。価格の波」を強くし、「時間の波」を弱くする。


何が怖いのか聞いてもいいでしょうか?

R_adx           = (ADX_DD - ADX_dD) * ADX_Main; 
string R_time_1 = TimeToStr(Time[p],TIME_SECONDS);
R_time          = StrToDouble(R_time_1); 
string T_time_1 = TimeToStr(Time[p],TIME_MINUTES);
T_time          = StrToDouble(T_time_1);
string B_time_1 = TimeToStr(Time[p],TIME_DATE);
B_time          = StrToDouble(B_time_1);
A_time          = R_time * T_time * B_time;
 
Zhunko:
しかし、例のスクリプトを調べることはできますか?これはワーキングコードではありません。


でも...しかし、私が最初に有名なiTicksのスクリプトを修正したのは、あなたのスクリプトだったのですここで、今、私は再びそれを実行し、最初にテストEA(そのコードは、このページではなく、前のページにあります)、次にiTicksの次の修正です。

#include <ServicesMT4.mqh>
extern int  delay_MSecond = 2000;
int start(){
   while(!IsStopped()){
      string _symbol = Symbol(); int _period = Period();
      int hWnd = WindowHandle(_symbol, _period);
      ServiceTickExpert(hWnd);
      Sleep(delay_MSecond);
   }
   return(0);
}

Check_ServicesMT4.dll.mq4のサンプルコードによるものです。

if (TickExpert) while (!IsStopped()) {ServiceTickExpert(hwndChart); Sleep(1000);}

グラフに変更はありません

チェックボックス「dll呼び出し許可」にチェックを入れると......。

によって追加されました。

ずん子

グラフを更新する方法は3つあります。

古いバージョンの投稿に返信していました、すみません、今調べます...。
 

gyftoさん、テストスクリプトの例は、設定したチャートを更新するようにできています。リモート(他人)のチャートに設定することが可能です。

スクリプトのためにチャートを更新しても意味がないことは明らかです。

Expert Advisorでチャート上に設定する。エキスパートが活躍する

#include <ServicesMT4.mqh>

int hWnd = 0;

void init()
 {
  hWnd = WindowHandle(Symbol(), Period());
  ServiceRefreshChart(hWnd, 500);
 }
void deinit()
 {
  ServiceStopRefreshChart(hWnd);
 }
void start()
 {
  Comment(TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS));
 }
 

男、私は馬鹿だ。自分の間違いに気がついたのです。キーワード

void start()
 {
  Comment(TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS));
 }

しました。

int init(){
   read_now = TimeCurrent() + delay;
}

などと、起動時(2013.12.31 18:59:59)には一定だった。そうやって不注意で失敗していく...。ご迷惑をおかけしました、これで全て納得です。

このコードは動作します。

int delay = 180;
datetime read_now;
int init(){
   read_now = TimeLocal() + delay;
   start();
}
int start(){
   while(!IsStopped()){
      int how_many_remains = read_now - TimeLocal();
      Comment(StringConcatenate(
         StringSubstr("-", (how_many_remains%60 >= 0), 0),
         StringSubstr("0", (MathAbs(how_many_remains/60) > 9), 0),
         MathAbs(how_many_remains/60),
         ":",
         StringSubstr("0", (MathAbs(how_many_remains%60) > 9), 0),
         MathAbs(how_many_remains%60)
      ));
      Sleep(1000);
   }
   return(0);
}

当然、週末だけです。改めて、ご迷惑をおかけしました。

 

それは適切ではありません。そういうことなんです。

#include <ServicesMT4.mqh>

int delay = 180;
datetime read_now;
int hWnd = 0;

void init()
 {
  read_now = TimeLocal() + delay;
  hWnd = WindowHandle(Symbol(), Period());
  ServiceRefreshChart(hWnd, 100);
 }
void start()
 {
  ServiceStopRefreshChart(hWnd);
  while(!IsStopped())
   {
    int how_many_remains = read_now - TimeLocal();
    Comment(StringConcatenate(StringSubstr("-", (how_many_remains%60 >= 0), 0),
                              StringSubstr("0", (MathAbs(how_many_remains/60) > 9), 0),
                              MathAbs(how_many_remains/60), ":",
                              StringSubstr("0", (MathAbs(how_many_remains%60) > 9), 0),
                              MathAbs(how_many_remains%60)));
    Sleep(1000);
   }
 }