[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 312

 
if(!trend)
      {

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

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
Les gars, où pouvez-vous télécharger une bibliothèque de notifications sonores. Par exemple, pour jouer une voix comme "Buy position closed at takeprofit". Ainsi, il peut être joué dans PlaySound("Buy_close_tp.wav") ;
 
YOUNGA:

c'est la même chose... Pour le décrire aussi, mais pour une situation différente.
 
Vous pouvez soit conduire, soit prendre la voiture ! Si vous passez la variable de tendance comme une valeur numérique, vous pouvez multiplier la différence par +1 ou -1 par exemple (je ne le ferais pas).
 
CYBOPOB:

N'est-ce pas ?

Artem, ça ne te dérange pas d'écrire le code, n'est-ce pas ? Ou donnez-moi ce truc que vous avez dans la main et je mettrai fin à cette misère...

Nan, vis un peu plus longtemps... :) Cassons votre code en privé, afin de ne pas encombrer le forum.
 
tCynik:

Question sur le fonctionnement du testeur : après qu'untest ait été réussi, vous changez les paramètres (dates, paire de devises, délai), relancez le test - il s'exécute, mais lorsqu'il est terminé, les informations dans les onglets comme "graphique" et "rapport" ne changent pas du tout - tout reste du test précédent. Le rapport sauvegardé s'avère également être ancien. Quelle en est la raison et comment y remédier ? Peut-être existe-t-il une fonction permettant de réinitialiser les résultats ?

J'ai lu le manuel, les articles, j'ai fait des recherches sur le forum - je n'ai rencontré aucune mention d'un tel problème...


Il ne devrait pas être comme ça, peut-être avez-vous coché "Optimisation" ?
 
Sepulca:

Cela ne devrait pas être le cas, peut-être avez-vous coché "Optimiser" ?


Oh, cela semble être le cas : en lançant un nouveau test, je n'ai pas remarqué que l'optimisation était activée, je pensais que ce n'était pas critique. Une solution d'interface un peu étrange...

Mais ça marche maintenant, merci beaucoup !

 
TarasBY:
Je n'ai pas creusé la logique, mais quelque chose me dit qu'il y a des calculs inutiles. Il y a un an et demi, je résolvais le même problème en rassemblant des citations et en formant des chandeliers M1 avec une coupe claire au début de la minute astronomique.
Si cela vous intéresse, vous pouvez jeter un coup d'œil à quelques moments d'optimisation pure de votre code (fichier). En réalité, si nous parlons sérieusement d'optimisation, vous devez mesurer le temps d'exécution du code. ;)


Maintenant, j'essaie une méthode différente, en partant de zéro.

Question pour Vadim sur la cartographie. Donc, euh... Je suis parti de zéro. Nous prenons le tic-tac original 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);
  }

En principe, il y a une logique très simple : nous attrapons un bidask, formons RateInfo, mais nous mettons le temps au Volume et modélisons le Temps. Maintenant, sans nous soucier de la façon de simuler le temps, nous supprimons complètement la simulation et la faisons par TOLHCV standard et avant cela nous mettons "si plus de 0 seconde s'est écoulée depuis le dernier appel de start()". S'il était inférieur dans une autre branche de la même condition, éditez High-Low et incrémentez Volume. Il s'agit essentiellement de la même chose que celle décrite ci-dessus, mais avec un cycle complètement supprimé, c'est-à-dire que nous obtenons une seconde TF "avec des lacunes" (avec des secondes manquantes) :

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

J'ai aussi laissé le classement haussier-baissier complètement éteint. Le jeu en vaut la chandelle ? Vérifions, mettez GetTickCount() avec rétrécissement à cette variante et à la variante initiale du propriétaire, exécutez-les simultanément sur un graphique, regardez le log :

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
 

comme prévu. Tick - original, secondes avec écarts - modifié. Formez maintenant un tableau auxiliaire avant time=TimeCurrent() :

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

C'est dans le code des secondes tf. Pour l'EA qui survolera le secondtf lui-même, les valeurs TOLHCV il y a x secondes peuvent alors être obtenues comme ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1, si bien sûr ce tableau est transmis d'une manière ou d'une autre. Alors, utilisons la cartographie :

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

Nous écrivons un script de test qui survole les secondes et lit les valeursTOLHCV il y a x secondes (pas les chandeliers) :

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

Nous travaillons à la seconde près. Lors de l'initialisation, une fenêtre s'affiche

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

Il y a 58.572 fois dans le journal

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.

et à la désinitialisation il montre une fenêtre

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

Bien deinitializatsii il plus tard, je mets le script - alerte une fois. Je surcharge MemoryCreate et MemoryCloseHandle, rien n'apparaît (le script garde l'alerte), le log

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

- et c'est tout. Donc, logiquement, j'utilise les appels dans le mauvais ordre ou je les déclare incorrectement. Mon système d'exploitation est WinXP. Vadim, dis-moi au moins dans quelle direction aller.

 
hoz:

Comment faire en sorte que lorsqu'un paramètre de tendance est passé à cette fonction, qui sera chargée de passer la supposée tendance principale du moment, le calcul sera basé sur ce paramètre.

C'est-à-dire que si la tendance == baisse, la fonction dans la boucle était comme maintenant, et sila tendance == hausse, l' Open[i ] et le Close[i] étaient échangés dans la boucle, de sorte que les conditions étaient respectées. Car dans ce cas, le prix de clôture de la barre sera inférieur au prix d'ouverture et la différence sera négative.


bool trend;

if ((2*trend-1)*Δ=>const) cnt++;
if ((2*trend-1)*Δ<const) cnt=0;
Dans ce cas,2*trend-1prend les valeurs +1 et -1, c'est-à-dire que si trend=vrai, il sera en hausse et trend=faux, il sera en baisse tandis que Δ sera respectivement pris avec le bon ou le mauvais signe. Ce n'est qu'un exemple où les mathématiques remplacent le "si".