[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 312

 

Ciao guru della programmazione

Potete dirmi per favore come disegnare un rettangolo riempito con il colore di sfondo nell'angolo in alto a sinistra con una piccola rientranza (per estetica) sopra il grafico e sotto il testo visualizzato dall'esperto?

Grazie in anticipo

 
if(!trend)
      {

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

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
Ragazzi, dove si può scaricare una libreria di notifiche sonore. cioè per riprodurre una voce come "Buy position closed at takeprofit". in modo che possa essere riprodotta in PlaySound("Buy_close_tp.wav");
 
YOUNGA:

è lo stesso... Anche per descriverlo, solo per una situazione diversa.
 
Puoi guidare o andare in macchina! Se passate la variabile trend come valore numerico, potete moltiplicare la differenza per +1 o -1 per esempio (io non lo farei)
 
CYBOPOB:

Non è così?

Artem, non ti dispiace scrivere il codice, vero? O dammi quella cosa che hai in mano e metterò fine a questa miseria...

No, vivere un po' più a lungo... :) Esaminiamo il tuo codice in privato, per non sporcare il forum.
 
tCynik:

Domanda sul funzionamento del tester: dopo che untest è passato, si cambiano i parametri (date, coppia di valute, timeframe), si esegue nuovamente il test - viene eseguito, ma quando è finito le informazioni nelle schede come "grafico" e "report" non cambiano affatto - tutto rimane dal test precedente. Anche il rapporto salvato risulta essere vecchio. Qual è la ragione e come risolvere il problema? Forse c'è qualche funzione per resettare i risultati?

Ho letto il manuale, gli articoli, ho cercato nel forum - non ho incontrato alcuna menzione di un tale problema...


Non dovrebbe essere così, forse hai spuntato "Ottimizzazione"?
 
Sepulca:

Questo non dovrebbe essere il caso, forse hai spuntato "Ottimizza"?


Oh, sembra essere questo il caso: quando ho eseguito un nuovo test non ho notato che l'ottimizzazione era attiva, pensavo non fosse critica. Soluzione di interfaccia un po' strana...

Ma ora funziona, grazie mille!

 
TarasBY:
Non ho scavato a fondo nella logica, ma qualcosa mi dice che ci sono alcuni calcoli inutili. Un anno e mezzo fa stavo risolvendo lo stesso problema con la raccolta di citazioni e la formazione di candele M1 con taglio netto all'inizio del minuto astronomico.
Se vi interessa, potete dare un'occhiata ad alcuni momenti di pura ottimizzazione del vostro codice (file). Davvero, se si parla seriamente di ottimizzazione, è necessario misurare il tempo di esecuzione del codice. ;)


Ora sto provando un modo diverso, completamente da zero.

Domanda per Vadim sulla mappatura. Quindi... Iniziato da zero. Prendiamo il ticchettio originale 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);
  }

In linea di principio, c'è una logica molto semplice: prendiamo un bidask, formiamo RateInfo, ma mettiamo il tempo al Volume e modelliamo il Tempo. Ora, senza preoccuparci di come simulare il Tempo, rimuoviamo completamente la simulazione e la facciamo con TOLHCV standard e prima mettiamo "se sono passati più di 0 secondi dall'ultima chiamata di start()". Se era inferiore in altri rami della stessa condizione, modifica High-Low e aumenta il volume. In sostanza è la stessa cosa descritta sopra ma con il ciclo completamente rimosso, cioè otteniamo il secondo TF "con lacune" (con secondi mancanti):

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

Inoltre ha lasciato la classificazione toro-peso completamente spenta. Vale la pena di rischiare? Controlliamo, mettiamo GetTickCount() con restringimento a questa variante e a quella iniziale del proprietario, eseguiamole simultaneamente su un grafico, guardiamo il 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
 

come previsto. Tick - originale, secondi con spazi vuoti - modificato. Ora formate un array ausiliario prima di time=TimeCurrent():

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

Questo è nel codice dei secondi tf. Per l'EA che passerà sul secondtf stesso, i valori TOLHCV x secondi fa possono allora essere ottenuti come ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1, se ovviamente questo array è in qualche modo passato. Quindi, usiamo la mappatura:

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

Scriviamo uno script di test che passa sopra i secondi e legge i valoriTOLHCV x secondi fa (non le candele):

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

Noi eseguiamo i secondi di tempo. All'inizializzazione, verrà visualizzata una finestra

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

Ci sono 58.572 volte nel registro

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.

e alla deinizializzazione mostra una finestra

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

Bene deinitializatsii più tardi, ho messo lo script - avviso una volta. Ho sovrascritto MemoryCreate e MemoryCloseHandle, non appare nulla (lo script mantiene l'avviso), il 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

- e questo è tutto. Quindi, a rigor di logica, sto usando le chiamate nell'ordine sbagliato o le sto dichiarando in modo errato. Il mio sistema operativo è WinXP. Vadim, dimmi almeno in che direzione andare.