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

 

プログラミングの達人こんにちは

左上 隅に背景色で塗りつぶされた長方形を、チャートの上とエキスパートが表示するテキストの下に(美観のために)小さくインデントして描く方法を教えていただけませんか?

ありがとうございました。

 
if(!trend)
      {

      (if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
例えば、「Buy position closed at takeprofit」のような音声を再生するには、PlaySound("Buy_close_tp.wav")で再生することができます。
 
YOUNGA:

同じだ...それも、シチュエーションが違うだけで表現するために。
 
車で行くも良し、車で行くも良し!トレンド変数を数値で渡せば、例えば差に+1や-1を掛けることができる(私はやらないけど)
 
CYBOPOB:

そうでしょう?

アルテムさん、コードを書くのは 気にしないでくださいね。それとも手に持っているものを渡せば、この惨めな状況を終わらせることができる......。

いや、もう少し長生きしてくれ...。:)フォーラムにゴミを散らかさないために、プライベートであなたのコードを見てみましょう。
 
tCynik:

テスターの操作についての質問:テストに 合格した後、パラメータ(日付、通貨ペア、タイムフレーム)を変更してテストを再実行すると、実行されますが、終了しても「チャート」や「レポート」などのタブの情報は全く変化せず、全て前回のテストのまま です。保存されたレポートも古いものであることが判明。その理由と解決方法を教えてください。もしかして、結果をリセットする機能があるのでは?

マニュアルや記事を読んだり、フォーラムを検索しても、そのような問題についての言及はありませんでしたが...。


最適化 "にチェックが入っているのでしょうか?
 
Sepulca:

このようなことはないはずです。もしかしたら、「最適化」にチェックを入れているのかもしれません。


ああ、そのようですね。新しいテストを実行するとき、最適化がオンになっていることに気づかず、重要ではないと思っていました。ちょっと不思議なインターフェイスの解決法...

でも、今は動いています!ありがとうございました。

 
TarasBY:
ロジックを深く掘り下げたわけではありませんが、何か、無駄な計算があるような気がしています。1年半前、私は同じ問題を、引用符の収集と、天文分始の明確なカットによるM1ローソクの形成で解決していた。もし興味があれば、あなたのコード(ファイル)の純粋な最適化のいくつかの瞬間を見てみることができるかもしれません。本当に、本気で最適化を語るなら、コードのランタイムを計測する必要があります。;)



今は、まったくゼロから別の方法に挑戦しています。

マッピングについてVadimに質問です。それで...ゼロからのスタート。オリジナルのティッキングTFを採用しています。

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);
      
      if(tick.chart.update == true)
        {
                  hwnd = WindowHandle(sn, 1);
        if(PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) == false)
          {
          hwnd = 0;
          return;
          }
          PostMessageA(hwnd, MT4InternalMsg, 2, 1);             
          }                  
      } 
  }
//----
   return(0);
  }

原理的には、BidaskをキャッチしてRateInfoを形成するが、VolumeにTimeを付けてTimeをシミュレートするという単純なロジックである。ここで、Timeのシミュレーションの仕方にこだわらず、シミュレーションを完全に削除して、標準のTOLHCVで行い、その前に「最後にstart()を呼び出してから0秒以上経過していたら」と書いています。同じ条件の別の枝で少なくなっていた場合は、High-Lowを編集してVolumeをインクリメントします。つまり、"ギャップあり "の秒TFを得ることができるのです。

int start(){  
//----
        if(flag){
                bid = MarketInfo(symbol, MODE_BID);
                ask = MarketInfo(symbol, MODE_ASK);
                   
                if(FileSeek(hFile, fpos, SEEK_SET) == false){ 
                        error = GetLastError();
                        Print("out: error(",error,"): ",ErrorDescription(error));
                        flag = false;
                        return;
                }else{
                        if(time==TimeCurrent()){
                                if(bid<bid_prev){
                                        FileSeek(hFile, fpos-32, SEEK_SET);
                                        FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                        FileFlush       (hFile);
                                }
                                if(bid<bid_prev){
                                        FileSeek(hFile, fpos-24, SEEK_SET);
                                        FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                        FileFlush       (hFile);
                                }
                                vol++;
                                FileSeek(hFile, fpos-8, SEEK_SET);
                                FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                FileFlush       (hFile);
                                bid_prev=bid; ask_prev=ask;
                        }else{
                                time=TimeCurrent();
                                vol=1;
                                if(bid<bid_prev){close=bid; open=ask;
                                }else{close=ask; open=bid;}
                                ask_prev=ask; bid_prev=bid;
                                
                                FileWriteInteger(hFile,  time,  LONG_VALUE);
                                FileWriteDouble (hFile,  open, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  ask, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  close, DOUBLE_VALUE);
                                FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                FileFlush       (hFile);
                                fpos = FileTell (hFile);
                        }
                        if(tick.chart.update == true){
                                hwnd = WindowHandle(sn, 1);
                                if(PostMessageA(hwnd, WM_COMMAND, 0x822c, 0) == false){
                                        hwnd = 0;
                                        return;
                                }
                                PostMessageA(hwnd, MT4InternalMsg, 2, 1);             
                        }            
                } 
        }
   return(0);
}

また、強気・弱気の採点は完全に外しておきました。賭けに出る価値はあるか?このバリアントとオーナーからの初期値に縮小してGetTickCount() を 置き、一つのチャートで同時に実行し、ログを見てみましょう。

16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:56 Тик.тф AUDUSD,M1: 0
16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:56 Тик.тф AUDUSD,M1: 0
16:14:56 Сек.тф с проп. AUDUSD,M1: 0
16:14:57 Тик.тф AUDUSD,M1: 0
16:14:57 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:14:58 Тик.тф AUDUSD,M1: 0
16:14:58 Сек.тф с проп. AUDUSD,M1: 0
16:15:00 Тик.тф AUDUSD,M1: 0
16:15:00 Сек.тф с проп. AUDUSD,M1: 0
16:15:00 Тик.тф AUDUSD,M1: 0
16:15:00 Сек.тф с проп. AUDUSD,M1: 0
16:15:04 Тик.тф AUDUSD,M1: 0
16:15:04 Сек.тф с проп. AUDUSD,M1: 0
16:15:04 Тик.тф AUDUSD,M1: 0
16:15:04 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:05 Тик.тф AUDUSD,M1: 0
16:15:05 Сек.тф с проп. AUDUSD,M1: 0
16:15:06 Тик.тф AUDUSD,M1: 0
16:15:06 Сек.тф с проп. AUDUSD,M1: 0
16:15:07 Тик.тф AUDUSD,M1: 0
16:15:07 Сек.тф с проп. AUDUSD,M1: 0
16:15:08 Тик.тф AUDUSD,M1: 0
16:15:08 Сек.тф с проп. AUDUSD,M1: 0
16:15:08 Тик.тф AUDUSD,M1: 0
16:15:08 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 0
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 0
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:09 Тик.тф AUDUSD,M1: 16
16:15:09 Сек.тф с проп. AUDUSD,M1: 0
16:15:10 Тик.тф AUDUSD,M1: 0
16:15:10 Сек.тф с проп. AUDUSD,M1: 16
16:15:11 Тик.тф AUDUSD,M1: 0
16:15:11 Сек.тф с проп. AUDUSD,M1: 0
16:15:11 Тик.тф AUDUSD,M1: 0
16:15:11 Сек.тф с проп. AUDUSD,M1: 0
16:15:12 Тик.тф AUDUSD,M1: 0
16:15:12 Сек.тф с проп. AUDUSD,M1: 15
 

予想通りダニ - オリジナル、隙間のある秒 - モディファイ。ここで、time=TimeCurrent()の前に補助配列を形成する。

Δt=TimeCurrent()-time;
Σ=Σ+Δt;
ArrayResize(ind, Σ);
for(; i<Σ; i++) ind[i]=iBars(sn, 1);
GlobalVariableSet("final", i);
time=TimeCurrent();

秒tfのコードにあります。secondtfにホバーリングするEAでは、x秒前のTOLHCVの値は、ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1として得られる(もちろんこの配列を何らかの形で渡すとする)。そこで、マッピングを使ってみよう。

//в шапке
#import "SharedMemoryMT4.dll"
        int MemoryCreate(int nArea, string sPrefixArea, int hFileUser, int nIndex, string sName, int nSize);
        bool MemoryWriteInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte, int nValue);
        bool MemoryCloseHandle(int nArea, string sPrefixArea, int hMemory);
#import
//в инит
hMapping=MemoryCreate(1, "", NULL, -1, "ind", 60*GlobalVariableGet("ADXBars"));
//в деинит
MemoryCloseHandle(1, "", hMapping);
//в старт вместо 
for(; i<Σ; i++) MemoryWriteInt(1, "", -1, "ind", i, iBars(sn, 1));//ind[i]=iBars(sn, 1);

秒にカーソルを合わせて、x秒前のTOLHCVの 値(ローソク足ではありません)を読み取るテストスクリプトを書きます。

#property show_inputs
#import "SharedMemoryMT4.dll"
   int MemoryOpen(int nArea, string sPrefixArea, int nIndex, string sName);
   int MemoryReadInt(int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte);
#import
extern int x;//сколько секунд назад с данного момента прикрепления смотрим значения TOLHCV

int init()
  {
   MemoryOpen(1, "", -1, "ind");
   return(0);
  }
int start()
  {
   //MemoryReadInt(1, "", -1, "ind", i) это ind[i], GlobalVariableGet("final") это последний элемент в массиве, а ф-ла выглядит так: n=ind[final]-ind[final-x]+1
   int n=MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final"))-MemoryReadInt(1, "", -1, "ind", GlobalVariableGet("final")-x)+1;
   Alert(TimeToStr(TimeCurrent(),TIME_SECONDS), ": Time=", TimeToStr(Time[n], TIME_SECONDS), ", Open=", Open[n], ", High=", High[n], ", Low=", Low[n], ", Close=", Close[n], ", Volume=", Volume[n]);
   return(0);
  }

秒の時間軸を走らせる。初期化時に、ウィンドウが表示されます

Ошибка в методе "Utils::Memory::Mapping::Create()".
В файловом отображении ""
не выделена память при отсутствии дескриптора пользовательского файла.

ログには58.572回の記録があります

10:45:42 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.
...
10:48:43 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.

というウィンドウが表示され、初期化時に

В методе "MT4::Memory::SearchIndexOrHandle()" не установлен параметр для поиска в области памяти терминала.

まあdeinitializatsiiそれを後で、私はスクリプトを置く - 一度だけ警告。MemoryCreate と MemoryCloseHandle をオーバーライドしても、何も表示されず(スクリプトはアラートを維持)、ログは

10:54:55 PrintForSec sec_EURUSD,M1 inputs: x=8; 
10:54:56 PrintForSec sec_EURUSD,M1: initialized
10:54:56 PrintForSec sec_EURUSD,M1: Alert: 09:55:05: Time=00:00:00, Open=0, High=0, Low=0, Close=0, Volume=0

10:55:36 PrintForSec sec_EURUSD,M1 inputs: x=2; 
10:55:37 PrintForSec sec_EURUSD,M1: initialized
10:55:38 PrintForSec sec_EURUSD,M1: Alert: 09:55:46: Time=00:00:00, Open=0, High=0, Low=0, Close=0, Volume=0

- ということで、終了です。つまり、論理的に言えば、呼び出しの順番を間違えているか、宣言の 仕方を間違えているのです。私のOSはWinXPです。ヴァディム、せめて方向だけでも教えてくれ。