Comunità di esperti - pagina 4

 
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?

3 persone stavano guardando =)) Renat è venuto e ha appena puntato il dito sull'errore =)))
Lo controllerò ora, naturalmente, ma probabilmente è questo il problema... Non ho normalizzato "bid - TrailingStop * point", e questa stessa costruzione è coinvolta nella modifica dell'ordine...
Non siamo attenti, signori ;)


Così diverse persone vi hanno proposto questa variante del problema. Anche io ho scritto che l'offerta può avere 5 cifre decimali. All'inizio ho pensato che non fosse possibile, ma poi mi sono ricordato che le citazioni sono fatte da un automa che probabilmente prende le citazioni da diversi datafeed e ne fa una media usando un qualche tipo di algoritmo.
 
Anche io ho scritto che l'offerta può avere 5 cifre decimali. All'inizio ho pensato che fosse impossibile

Bid/Ask hanno una precisione dei simboli inequivocabilmente standard. Un'altra cosa è che invece di 1.6666 potresti vedere 1.6665999 (a causa di un errore in virgola mobile).

Voglio notare: i problemi di confronto di questi numeri(tipo double) esistono in _tutti_ i linguaggi e sono una conseguenza della precisione limitata di base di questo tipo di aritmetica. Di conseguenza, non bisogna incolpare nessuno, ma essere consapevoli del problema e scrivere codice protetto.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Bid/Ask sono chiaramente di una precisione standard dei caratteri. Un'altra cosa è che invece di 1.6666 si può vedere 1.6665999 (a causa delle peculiarità dell'errore in virgola mobile).

Voglio notare: i problemi di confronto di questi numeri (tipo double) esistono in _tutti_ i linguaggi e sono una conseguenza della precisione limitata di base di questo tipo di aritmetica. Di conseguenza, non bisogna incolpare nessuno, ma essere consapevoli del problema e scrivere codice sicuro.


Quindi non sto accusando nessuno. Non ho chiesto niente a komposter - su cui il trailing di valuta non ha funzionato correttamente. Ricordo con certezza che in MT3 si possono vedere 3 posizioni decimali in Yen. Almeno, l'ho visto più di una volta.
 
3 persone stavano guardando =) Renat è venuto e ha appena puntato il dito sull'errore =)))<br/ translate="no"> ora controllerò, naturalmente, ma molto probabilmente questo è il caso... Non ho normalizzato "bid - TrailingStop * point", e questa stessa costruzione partecipa alla modifica dell'ordine...
non siamo attenti, signori ;)

la normalizzazione non ha aiutato =(
più precisamente - trailing errors (euro - buy position):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
(server time)
 
Scusa, intendevo il NormalizeDouble standard.

Renat, come devo procedere?
Al momento ci sono 3 opzioni:
1. if ( ordertoploss < ( bid - TrailingStop * point ) ) sostituito da if ( TrailingStop < ( bid -orderstoploss) / point )
2. Confronta int, non double, usando le funzioni Begun
3. Cambia l'anticipo dello stop (non ogni punto, ma dopo n spreads)
e le loro combinazioni, naturalmente.

Dato che il software è abbastanza responsabile, vorrei avere (! non una garanzia!) raccomandazioni per scrivere...
 
<br / translate="no"> la normalizzazione non ha aiutato =(


Prova invece:
if (orderstoploss < ( bid - TrailingStop * point ))


scrivere:

double newSL = NormalizeDouble(bid - TrailingStop * Point);
if (orderstoploss + Point < newSL)
   orderstoploss  = newSL;//OrderModify(... newSL...)



Ci saranno anche errori?

 
beh, se " + Punto" non lo so... ma in realtà ho la stessa cosa ora...
È chiaro che si può fare un contraccolpo, ma non è serio.... E se devo fare un contraccolpo di 10-20 pips, "per affidabilità", sì, su M30, solo una favola =)
 
Renat, come procedere comunque?

Ricontrolla di nuovo il tuo codice, semplificalo, inserisci messaggi di debug.
 
Ricontrolla di nuovo il tuo codice, semplificalo, inserisci messaggi di debug.


Ad essere onesti, non so come semplificare...
Ma si può controllare, naturalmente. Ecco il codice come è usato ora (in parti):

controlla i parametri in entrata e seleziona l'ordine richiesto. Se si verifica un errore, semplicemente usciamo, cioè l'ordine non sarà modificato...
int _TrailingStop ( int _OrderTicket, int TrailingStop, color _Color = CLR_NONE )
{
//	Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - loaded..." );
	if ( TrailingStop <= 0 )
	{
//		Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(0);" );
		return(0);
	}
	
	if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false )
	{
//		Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-2);" );
		return(-2);
	}



Salvare tutti i dati degli ordini in variabili e normalizzarli:

	string _Symbol = OrderSymbol();
	int _OrderType = OrderType();
	double point = MarketInfo ( _Symbol, MODE_POINT );
	int digits = MarketInfo( _Symbol, MODE_DIGITS );
	double bid = NormalizeDouble( MarketInfo ( _Symbol, MODE_BID ), digits );
	double ask = NormalizeDouble( MarketInfo ( _Symbol, MODE_ASK ), digits );
	double orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
	double orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );
	double ordertakeprofit = NormalizeDouble ( OrderTakeProfit(), digits );
	datetime orderexpiration = OrderExpiration();
	double NewStopLoss;




questo è il colore e la "gentilezza" del tronco...

	string _OrderType_str = _OrderType_str ( _OrderType );
	if ( _Color <= 0 )
	{
		_Color = ordersellcolor;
		if ( _OrderType == OP_BUY || _OrderType == OP_BUYLIMIT || _OrderType == OP_BUYSTOP )
		{ _Color = orderbuycolor; }
	}



ora, per una posizione lunga, definire un nuovo livello di SL, normalizzarlo e confrontarlo con quello vecchio (solo se la posizione è redditizia)

	if ( _OrderType == OP_BUY )
	{
		NewStopLoss = NormalizeDouble( bid - TrailingStop * point, digits );
		if ( ( bid - orderopenprice ) > 0 )
  		{
			if ( orderstoploss <= 0 || orderstoploss < NewStopLoss )//TrailingStop < ( bid - orderstoploss ) / point )
			{


scaricarlo nel registro

				_info1 ( "Trailing Stop (" + TrailingStop + " points) для позиции № " + _OrderTicket + ", " + _OrderType_str + "..." );
				_info2 ( "New Stop Loss = " + DoubleToStr( NewStopLoss, digits ) );
				_info3 ( "" );
				_info4 ( "" );



un triplo tentativo di modificare l'ordine dopo una pausa di 10 secondi (l'ordine viene evidenziato ogni volta)

				for ( int x = 0; x < 3; x ++ )
				{
					while ( LocalTime() - GlobalVariableGet ( "LastTradeTime" ) < 10 )
					{ Sleep(1000); }

					if ( OrderSelect( _OrderTicket, SELECT_BY_TICKET ) == false )
					{
//						Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-2);" );
						return(-2);
					}

					int ordermodify = OrderModify( _OrderTicket, orderopenprice, NewStopLoss, ordertakeprofit, orderexpiration, _Color );


e solo se ordermodify <= 0 viene inviato un codice di errore

					if ( ordermodify > 0 )
					{
						_info3 ( "Успешно..." );
						GlobalVariableSet ( "LastTradeTime", LocalTime() );
//						Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(1);" );
						return(1);
					}
					int error_code = GetLastError();
					_info1 ( "Ошибка Trailing Stop!!!", 1 );
					Processing_Error ( error_code );
					Sleep(10000);
				}


se dopo 3 tentativi l'ordine non è stato modificato, si esce (-1)

//				Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(-1);" );
				return(-1);
			}
  		}
  	}


poi lo stesso per le posizioni di vendita

 	if ( _OrderType == OP_SELL )
	{
	}


e infine, se non c'è bisogno di modificare lo stop, exit(0)

//Print( "_TrailingStop ( ", _OrderTicket, ", ", TrailingStop, " ) - return(0);" );
return(0);
}





non lo so....

 
<br / translate="no"> comprensibilmente, è possibile fare un contraccolpo, ma non è serio.... E se dobbiamo fare un contraccolpo di 10-20 pips, "per affidabilità", sì su M30, solo una favola =)


Cosa c'entra questo? "+Punto" risolve il problema dell'arrotondamento dell'ultima cifra significativa del prezzo. Non stiamo parlando di 2, 3, e tanto più di 10-20 pips.