[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 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim Rispetto e rispetto !!! |
//+----------------------------------------------------------------------------+

Questa è stata senza dubbio la parte più stressante del codice))))

Ok. Non capisco niente. Ho messo in funzione il secondo TF. Tutto dovrebbe funzionare come un orologio. Ma non è così. No, funziona, ma non è come previsto. L'ho controllato mille volte. Io stesso non vedo alcun errore sintattico o algoritmico. Provo a spiegarmi, allego il codice completo. Quindi:

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

All'inizio di start() ho messo un gestore per il numero di secondi passati dall'ultimo start(). Le sezioni ripetute vengono spostate in funzioni definite dall'utente. Il nuovo valore time=TimeCurrent() è assegnato lì, nelle funzioni utente.

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

La funzione funziona in due modi: nel primo ramo, AtFirst=true, cattura solo un tick e pre-azzera l'array-storage, mentre nel secondo ramo, AtFirst=false, funziona esattamente come un tick store. Cioè, o azzeriamo e tronchiamo il disco e catturiamo il bid-ask in una cella zero, o allunghiamo il disco e catturiamo il bid-ask. L'allarme è stato impostato solo a scopo di debug. Descriverò più avanti la condizione di azzeramento dell'accumulatore.

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

La funzione di 'disegnare' la candela (aggiungere una candela al .hst aperto nel grafico autonomo). Allo stesso modo - ho messo degli avvisi per il debug. Il primo avviso segnala a due tick catturati in un secondo (la dimensione dell'array è uguale a due, e in idea il volume dovrebbe essere uguale a due), mentre il secondo segnala a bit uguale a ack nel tick catturato (avviso simile in drive: ma lavorano non sincronicamente per qualche motivo), e il volume della candela. Questo è tutto in teoria, infatti, quando si inserisce nel file (per avviso), per esempio, due (o 0x00 00 00 00 00 00 00 40, doppio 2.0) risulta ancora in qualche modo essere uno (0x00 00 00 00 00 F0 3F, doppio 1.0 in formato BigEndian). Di solito sovrascrivo quell'allarme nell'unità, suona spesso, lavoro con questi due.

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

La funzione "disegna" un trattino nel caso in cui non ci sia stato alcun tick in quale secondo. Funziona secondo il seguente algoritmo:

Δtime=0: catch (copy) ticks.

Δtime=1: Disegna una candela sul tick che è stato catturato prima, poi cattura il tick (con un accumulatore preliminarmente azzerato).

Δtime>1: disegna una candela sul tick catturato prima, disegna dei trattini sulla linea Close[0] nella quantità diΔtime-1, cattura un tick (con accumulatore preliminarmente azzerato). In tutti i casi l'accumulatore dovrebbe essere azzerato quando una candela è già stata disegnata su di esso e significa che l'accumulatore non è più necessario. Questo accade quandoΔtime>0.

Facciamo un giro di prova:

Con la freccia ho disegnato i momenti in cui l'offerta è presumibilmente uguale all'asc e il volume dovrebbe essere presumibilmente uguale a uno. Non ho catturato il fondo con i volumi, non si può vedere nulla lì comunque, è poco profondo. Ma sono tutti a livello, cioè o zero o uno, nessuno sale a due (anche se l'allarme è segnalato). Due tick al secondo - ancora quando si passa il mouse mostra ironicamente volume = 1, e l'offerta è uguale a asku mostra anche ironicamente volume = 0. Perché? Capisco che da qualche parte c'è un errore, ma molto probabilmente non mi accorgo dell'errore, o guardo nel posto sbagliato. Sto allegando il codice, ho commentato bene la mia parte di codice, ho controllato i rientri ovunque, ho rimosso gli inluder, ho solo selezionato le funzioni da usare, in modo che si compili più velocemente. L'unica osservazione - non funziona offline, cioè con TimeLocal, a differenza del raccoglitore di tick originale, perché ho scritto in if(tickTimeLocal==true) lì da zero (dato che non ne avevo molto bisogno). Ho provato a tradurlo in Expert Advisor seguendo i consigli di Taras - le candele non sono mostrate nel grafico autonomo (ma la linea della quotazione attuale si muove bene).

File:
fif.ta.mq4  18 kb
 
artmedia70:

le tue pantofole.

Dovresti ricevere uno spoiler dall'amministrazione. Ho iniziato a notare che le calzature non commentate non diventano meno calzature per qualche motivo))
 

Ciao

Ecco una domanda. Diciamo che oggi è lunedì. Ho bisogno di sapere il prezzo di chiusura di venerdì. Ho bisogno di sapere il prezzo di chiusura di venerdì.

iClose(NULL, Period_D1, 1)
Ho fatto questa domanda perché vedo le barre del sabato e della domenica nello Strategy Tester. Non ho scambiato in questi giorni. Sopra la linea scritta c'è il prezzo di chiusura di venerdì o di domenica?
 
gince:

Ciao

Ecco una domanda. Diciamo che oggi è lunedì. Ho bisogno di sapere il prezzo di chiusura di venerdì. Posso scrivere

Ho questa domanda perché nello Strategy Tester vedo delle barre il sabato e la domenica. Non faccio trading in quei giorni. Sopra la linea scritta dà il prezzo di chiusura del venerdì o della domenica?

Dammi il prezzo di venerdì! Se il server chiude non più tardi delle 24.00 di venerdì e inizia non prima delle 0.00 di domenica!

Usa l'indicatore DailyPivotPoints!

 

No, non lo capisco affatto. Chiaramente già scrivendo

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

Agli avvisi uguali a 2, tolgo l'indicatore dalle minuzie, trascino il mouse sulla candela... Volume=1.

Guardato RateInfo in hst attraverso FileInsight (come debugger), penso che forse c'è int, ma non doppio in Volume - no, stesso-doppio...

 

Buona sera.

Grazie per la risposta alla mia domanda))

Per favore ditemi se piazzo un ordine di acquisto come questo OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Se è un ordine di venditaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,0,Red);


la differenza è blu o deve cambiare anche il colore rosso? cioè dove OP_BUY è il prezzo dell'offerta

dove OP_SELL ha il prezzo Ask

Volevo anche controllare se il mio ordine non è cambiato e non volevo cambiarlo, quindi perché tutto è andato bene nello Strategy Tester e nella Demo, ma ho avuto un errore di 129 quando ho provato ad aprirlo nel mercato reale?

 
ed3sss:

Buona sera.

Grazie per aver risposto alla mia domanda))

Per favore ditemi se apro un ordine di acquisto come questo OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Se è un ordine di venditaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,0,Red);

la differenza è blu o deve cambiare anche il colore rosso? cioè dove OP_BUY è il prezzo dell'offerta

dove OP_SELL ha il prezzo Ask

Volevo anche controllare se il mio ordine non è cambiato e non volevo cambiarlo, quindi perché tutto è andato bene nello Strategy Tester e nella Demo, ma ho avuto un errore di 129 quando ho provato ad aprirlo nel mercato reale?

Se si apre Buy, su Asc, se Sell su Bid! E chiudere il contrario!
 
ed3sss:

Buona sera.

Grazie per aver risposto alla mia domanda))

Potete dirmi se apro un ordine di acquisto come questo OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,0,Green);

Se è un ordine di venditaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,0,Red);

...
Su Buy:
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

Vendere:

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

Raccomando di aggiornare i preventivi prima di inviare un ordine:

RefreshRates();
OrderSend (...);
E notate che il vostro slipage =3, per le quotazioni a 4 cifre sarà =3 pips e per le quotazioni a 5 cifre sarà calcolato come 0,3 pips. Quindi, se il tuo EA lavorerà con quotazioni a 5 cifre, allora imposta slipage = 30.
 
gyfto:

No, non lo capisco affatto. Chiaramente già scrivendo

Agli avvisi uguali a 2, tolgo l'indicatore dai minuti, trascino il mouse sulla candela... Volume=1.

Guardato RateInfo in hst attraverso FileInsight (come debugger), penso che forse c'è int, ma non doppio in Volume - no, stesso-doppio...

Ho guardato il tuo codice.... Hai tutto troppo confuso))))

Non capisco bene perché abbiamo bisogno di accumulare ticks, perché è sufficiente memorizzare in memoria (o anche non memorizzare, perché la barra corrente deve essere scritta in HST - altrimenti il grafico non sarà aggiornato) i parametri della barra corrente - sei numeri TOHLCV, e aggiornarli come necessario alla ricezione del tick, e fare il cutoff della barra alla condizione specificata(TimeCurrent()-O>1).

Provate a rielaborare il codice in questo modo, sarà ridotto di 8 volte, ve lo garantisco (ho controllato:)

 
Ho provato a controllare un indicatore, ho messo i numeri sul grafico ma non cambiano, provo a metterlo in un altro modo, ho bisogno dell'indicatore allegato per fissare il prezzo come una croce che sta su uno zigzag o un allarme o una stampa ma si blocca sulla connessione.
File: