Emulazione di tick da un EA/indicatore - pagina 8

 
expertboss, hai bisogno di un server 2008? A mio parere, le capacità del 2003 sono sufficienti, ed è meno esigente in termini di risorse, il che significa che si può scegliere un hardware più economico.
 
Meat:

Se questo tuo orologio è un esperto (non un indicatore), allora con tutta probabilità è semplicemente in loop, quindi non ha problemi a ricevere informazioni su più simboli. Questo è quello che ho scritto prima, che non c'è davvero un grande problema con i tick in Expert Advisor, perché può essere messo in loop. Ma con un indicatore questo numero non funziona.

Per quanto riguarda i diversi sistemi operativi, è ancora un mistero per me. Come ho scritto sopra, funziona bene per me su 7, ma altre persone non ce l'hanno per qualche motivo. Probabilmente qualcosa a che fare con i diritti di accesso...

A proposito, per quanto riguarda le "librerie di sostituzione", provate a prendere i file user32 e kernel32 da WinXP(2003) e a metterli nella cartella Experts\libraries sul computer dove è installato Vista(2008). E se funzionasse? :) ...anche se ne dubito...

Lo dirò direttamente sui ticchettii, sono dalla "tua parte" ma per quanto riguarda l'orologio, a giudicare dalla tua risposta, non hai capito il mio pensiero che proverò con il codice:

int init()

{

ObjectCreate("ServerTime", OBJ_LABEL, 0,0,0,0,0;)

ObjectSet("ServerTime", OBJPROP_CORNER, 3);

ObjectSet("ServerTime", OBJPROP_XDISTANCE, 10);

ObjectSet("ServerTime", OBJPROP_YDISTANCE, 37);

ObjectSetText("ServerTime", "", 20, "Arial", Green);

ritorno;

}

int start()

{

ObjectSetText("ServerTime", TimeToStr( TimeCurrent(), TIME_SECONDS ));

...

ritorno;

}

Se c'è solo un simbolo nella finestra "Market Watch", per il quale viene creato un grafico, l'ora e l'aggiornamento di questa ora coincide anche con il tick nel grafico e di conseguenza con il lavoro di Expert Advisor. Se ci sono diversi simboli nella finestra "Market Watch", allora i piccoli orologi che vengono visualizzati nell'intestazione "Market Watch : 22:59:58", quegli orologi spuntano con tutte le quotazioni per tutti i simboli, spuntano da qualche parte e come la quotazione è cambiata sulla mia coppia di valute così i miei orologi sono allineati con quelli. Questo è il mio pensiero """" se questi orologi possono essere aggiunti e applicati al mio EA o una finestra dove lavora l'Expert Advisor". e finiscono per avere molte più zecche che una sola citazione di coppia.

Alexander.

Non voglio mettere in loop le risorse ... Cioè, per combinare tutti i tick di tutte le quotazioni in un grafico?

 

Cosa vi fa pensare, signori, che questa sia un'aggressione? È solo un richiamo ai principi della cortesia. Prima di offrire qualcosa, devi mettere qualcosa in cambio. Se non hai niente puoi solo chiedere e questa è la verità.

Non sono molto esperto di sistemi a 64 bit ma sono molto interessato a questo argomento, ma siccome non posso fare nulla per aiutare qui, devo chiedere alle persone che sanno. Non ci vedo nulla di vergognoso.

 
FAQ:

Cosa vi fa pensare, signori, che questa sia un'aggressione? È solo un richiamo ai principi della cortesia. Prima di offrire qualcosa, devi mettere qualcosa in cambio. Se non hai niente puoi solo chiedere e questa è la verità.

Non sono molto esperto di sistemi a 64 bit ma sono molto interessato a questo argomento, ma siccome non posso fare nulla per aiutare qui, devo chiedere alle persone che sanno. Non ci vedo niente di male.


Credo di essermi fatto prendere dalle mie emozioni, ma lei è un moderatore e si guarda la bocca, grazie per l'osservazione e cercherò di raffreddare il mio ardore.

Addio. Alexander.

 
expertboss:

Ecco il pensiero """" se tutti questi tick possono essere sommati e applicati al mio Expert Advisor o alla finestra dove lavora l'Expert Advisor"" e finire con molte più zecche di un preventivo per una sola coppia.

Alexander.

Non voglio mettere in loop le risorse ... Cioè, volete combinare tutti i tick di tutte le quotazioni in un grafico?

Un EA reagisce solo ai propri tick, quindi non si può "aggiungere" nulla. Ci sono solo due opzioni: o si imposta un timer (come ho suggerito), o si esegue in parallelo un EA in loop su un altro grafico, che "spunta" il tuo EA. E in questo EA in loop, è possibile specificare le condizioni in cui "spunterà". Per esempio, se il valore di TimeCurrent() è cambiato, come nel vostro caso. Anche se, di nuovo, non vedo il punto di avere un EA aggiuntivo, se l'EA iniziale (cioè il tuo orologio) può fare lo stesso.

 
In realtà, imho, la soluzione a tutti i problemi sarebbe trovare l'indirizzo della funzione Start in memoria :) Poi si potrebbe pensare a molte cose, fino all'esecuzione di programmi multi-thread.
 
Ho affrontato un problema con il seguente piano quando il terminale non riceve tick regolari e il timer è in esecuzione rispettivamente l'EA sta lavorando attraverso il codice e ad un certo punto l'EA inizia ad inviare false richieste per esempio per chiudere l'ordine, lì risulta che alla fine il server invia un errore generale "2" poi errore "3" e può anche dare per il numero di ordine, ecc. Sono uscito dalla situazione in questo modo """""""""""" if (OrdersTotal()==0){Alert ("Niente da cancellare");Sleep(1000);break;} // Se non ci sono ordini, esce dal ciclo chiudendo """"""""""""" (exit while), ma sai, è un po' scorretto. Domanda: è possibile fare un qualche tipo di comando o operatore (non so nemmeno come chiamarlo) per sospendere i tick fino a quando non riceviamo una risposta dal server true (per esempio true=OrderClose (OrderTicket(),....) e poi come al solito. Naturalmente, questa è una richiesta, per quanto possibile. Un'altra osservazione (l'ho notata nel fine settimana) - se sposto il grafico, ritorna alla posizione dal generatore o un tick, il pulsante "EAs" è stato rilasciato e non ci sono tick, ma il grafico ritorna comunque alla posizione, ho rimosso l'EA dal grafico, tutto questo si è fermato. Sv. Alexander.
 
Meat:

Comunque, ecco la versione finale della funzione:

// push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;

Per quanto ho capito, usate il comando PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1). Questo comando emula i tick per l'Expert Advisor (secondo la descrizione in WinUser32.h). Per gli indicatori i tick non vengono emulati, e di conseguenza l'indicatore non viene aggiornato. Sfortunatamente, non ho WinXP per i test, ma se i tick dell'indicatore sono emulati in XP, sono sorpreso.

Ho anche controllato il tuo algoritmo

  for (int i=0;  i<ArraySize(value);  i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] |= value[i]>>(8*j)&0xFF<<(byte%4*8);

sotto il debugger VisualStudio e il risultato che ho ottenuto nell'array TimerCode non corrispondeva affatto ai risultati attesi. Sei sicuro che questo algoritmo non contenga errori? Posso darvi il codice e uno screenshot del risultato. Se volete, possiamo discuterne più in dettaglio.

 

Anche se questo argomento non è molto attuale ora, ma penso che ci siano ancora quelli che non hanno fretta di passare alle nuove costruzioni :) Quindi, se qualcuno non ha il tick timer in Win7/Win8, è necessario disabilitare lo strumento DEP o aggiungere questa funzione:

#import "kernel32.dll"
  bool  VirtualProtect(int lpAddress[], int dwSize, int flNewProtect, int& lpflOldProtect[]);

E alla fine questa variante:

int SetMyTimer(int interval=1000, int timerId=0)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0 || hWnd==0) return(0);
  static int TimerCode[7];  ArrayInitialize(TimerCode,0);
  int oldprotect[1]; 
  VirtualProtect(TimerCode, ArraySize(TimerCode)*4, 0x40, oldprotect);  // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int bytes[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  bytes[8]=MT4InternMsg;  bytes[10]=hWnd;  bytes[12]=PostMsgAddr;
  int nbyte=0;  
  for (int i=0;  i<ArraySize(bytes);  i++)
    for (int j=0;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/4] |= bytes[i]>>(8*j)&0xFF<<(nbyte%4*8);
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
  return (timerId);
}
Motivazione: