[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 312

 

Hallo Programmier-Guru

Können Sie mir bitte sagen, wie ich ein mit der Hintergrundfarbe gefülltes Rechteck in der oberen linken Ecke mit einer kleinen Einkerbung (für die Ästhetik) über dem Diagramm und unter dem vom Experten angezeigten Text zeichnen kann?

Vielen Dank im Voraus

 
if(!trend)
      {

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

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
Jungs, wo kann man eine Bibliothek von Sound-Benachrichtigungen herunterladen. d.h. eine Stimme wie "Buy position closed at takeprofit" zu spielen. so kann es in PlaySound("Buy_close_tp.wav") gespielt werden;
 
YOUNGA:

es ist dasselbe... Um es auch zu beschreiben, nur in einer anderen Situation.
 
Sie können entweder selbst fahren oder mit dem Auto fahren! Wenn Sie die Trendvariable als numerischen Wert übergeben, können Sie die Differenz z. B. mit +1 oder -1 multiplizieren (ich würde das nicht tun)
 
CYBOPOB:

War es das nicht?

Artem, mach dir nichts aus, den Code zu schreiben, ja? Oder gib mir das Ding, das du in der Hand hast, und ich beende dieses Elend...

Nee, lebe noch ein bisschen länger... :) Lassen Sie uns Ihren Code unter vier Augen durchgehen, um das Forum nicht zu überladen.
 
tCynik:

Frage zur Funktionsweise des Testers: Nachdem Sieeinen Test durchgeführt haben, ändern Sie die Parameter (Daten, Währungspaar, Zeitrahmen) und führen den Test erneut aus - er läuft, aber wenn er beendet ist, ändern sich die Informationen in den Registerkarten wie "Diagramm" und "Bericht" überhaupt nicht - alles bleibt vom vorherigen Test erhalten. Der gespeicherte Bericht ist ebenfalls veraltet. Was ist der Grund dafür und wie kann man ihn beheben? Vielleicht gibt es eine Funktion zum Zurücksetzen der Ergebnisse?

Ich habe das Handbuch gelesen, Artikel gelesen, das Forum durchsucht - ich habe keine Hinweise auf ein solches Problem gefunden...


Das sollte nicht so sein, vielleicht haben Sie die Option "Optimierung" aktiviert?
 
Sepulca:

Das sollte nicht der Fall sein, vielleicht haben Sie "Optimieren" angekreuzt?


Oh, das scheint der Fall zu sein: Als ich einen neuen Test durchführte, habe ich nicht bemerkt, dass die Optimierung eingeschaltet war, weil ich dachte, es sei nicht kritisch. Eine etwas seltsame Schnittstellenlösung...

Aber jetzt funktioniert es, vielen Dank!

 
TarasBY:
Ich habe mich nicht eingehend mit der Logik befasst, aber irgendetwas sagt mir, dass es einige unnötige Berechnungen gibt. Vor anderthalb Jahren löste ich das gleiche Problem mit dem Sammeln von Kursen und der Bildung von M1-Kerzenständern mit klarem Schnitt zu Beginn der astronomischen Minute.
Wenn Sie daran interessiert sind, können Sie sich einige Momente der reinen Optimierung Ihres Codes (Datei) ansehen. Wenn wir ernsthaft über Optimierung sprechen, müssen Sie die Laufzeit des Codes messen. ;)


Jetzt versuche ich es auf eine ganz andere Art und Weise, von Grund auf.

Frage an Vadim zum Mapping. Also, äh... Von Grund auf neu begonnen. Wir nehmen das ursprüngliche TF-Ticken:

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);
  }

Im Prinzip gibt es eine sehr einfache Logik: Wir fangen einen Bidask, bilden RateInfo, aber wir setzen die Zeit auf Volume und modellieren Time. Nun, ohne sich darüber Gedanken zu machen, wie man die Zeit simuliert, entfernen wir die Simulation komplett und machen es mit dem Standard TOLHCV und davor setzen wir "wenn mehr als 0 Sekunden seit dem letzten Aufruf von start() vergangen sind". Wenn es in einem anderen Zweig derselben Bedingung weniger war, bearbeiten Sie High-Low und erhöhen Sie Volume. Im Wesentlichen ist es dasselbe wie oben beschrieben, nur dass der Zyklus vollständig entfernt wurde, d. h. wir erhalten eine zweite TF "mit Lücken" (mit fehlenden Sekunden):

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);
}

Auch die Einstufung "bullish-bearish" wurde komplett gestrichen. Lohnt sich das Glücksspiel? Überprüfen wir, setzen Sie GetTickCount() mit Schrumpfung auf diese Variante und auf die ursprüngliche vom Eigentümer, führen Sie sie gleichzeitig auf einem Diagramm, schauen Sie sich das Protokoll:

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
 

wie erwartet. Tick - Original, Sekunden mit Lücken - modifiziert. Bilden Sie nun ein Hilfsarray vor time=TimeCurrent():

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

Dies ist im Code der Sekunden tf. Für den EA, der auf der Sekunde selbst schwebt, können die Werte von TOLHCV vor x Sekunden dann als ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1 ermittelt werden, wenn dieses Array natürlich irgendwie übergeben wird. Verwenden wir also das Mapping:

//в шапке
#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);

Wir schreiben ein Testskript, das den Mauszeiger über die Sekunden bewegt und dieTOLHCV-Werte von vor x Sekunden liest (nicht die Candlesticks):

#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);
  }

Wir lassen den Sekunden-Zeitrahmen laufen. Bei der Initialisierung wird ein Fenster angezeigt

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

Es gibt 58.572 Mal im Protokoll

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.

und bei der Deinitialisierung zeigt es ein Fenster

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

Nun deinitializatsii es später, legte ich das Skript - die Warnung einmal. Ich überschreibe MemoryCreate und MemoryCloseHandle, nichts erscheint (das Skript behält die Meldung), das Protokoll

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

- und das war's. Logischerweise verwende ich also die Aufrufe in der falschen Reihenfolge oder deklariere sie falsch. Mein Betriebssystem ist WinXP. Vadim, sag mir wenigstens, in welche Richtung ich gehen soll.