Gemeinschaft des Fachwissens - Seite 4

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

3 Leute schauten zu =)) Renat kam und zeigte einfach mit dem Finger auf den Fehler =)))
Ich werde das natürlich sofort überprüfen, aber das ist wahrscheinlich das Problem... Ich habe "bid - TrailingStop * point" nicht normalisiert, und genau diese Konstruktion ist an der Auftragsänderung beteiligt...
Wir sind nicht aufmerksam, meine Herren ;)


Mehrere Personen haben Ihnen also diese Variante des Problems angeboten. Ich habe sogar geschrieben, dass ein Gebot 5 Dezimalstellen haben kann. Ich dachte zuerst, das sei nicht möglich, aber dann fiel mir ein, dass die Kurse von einem Automaten erstellt werden, der wahrscheinlich Kurse aus mehreren Dateneinspeisungen nimmt und sie mit Hilfe eines Algorithmus mittelt.
 
Auch ich habe geschrieben, dass Gebote 5 Dezimalstellen haben können. Zuerst dachte ich, das sei unmöglich

Bid/Ask haben eine eindeutige Standard-Symbolgenauigkeit. Außerdem kann es sein, dass statt 1,6666 1,6665999 angezeigt wird (aufgrund eines Gleitkommafehlers).

Ich möchte anmerken: Probleme beim Vergleich dieser Zahlen(Typ double) gibt es in _allen_ Sprachen und sind eine Folge der begrenzten Genauigkeit dieser Art von Arithmetik. Daher sollte man niemandem die Schuld geben, sondern sich des Problems bewusst sein und geschützten Code schreiben.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Bid/Ask sind eindeutig von standardmäßiger Zeichengenauigkeit. Außerdem kann es vorkommen, dass statt 1,6666 1,6665999 angezeigt wird (wegen der Besonderheiten des Gleitkommafehlers).

Ich möchte anmerken: Probleme beim Vergleich dieser Zahlen (Typ double) gibt es in _allen_ Sprachen und sind eine Folge der grundsätzlich begrenzten Genauigkeit dieser Art von Arithmetik. Dementsprechend sollten Sie niemandem die Schuld geben, sondern sich des Problems bewusst sein und sicheren Code schreiben.


Ich will also niemanden beschuldigen. Ich habe komposter nicht umsonst gefragt, bei welcher Währung das Trailing nicht richtig funktioniert hat. Ich erinnere mich sicher, dass in MT3 Sie 3 Dezimalstellen in Yen sehen können. Zumindest habe ich es mehr als einmal gesehen.
 
3 Leute schauten zu =) Renat kam und zeigte einfach mit dem Finger auf den Fehler =)))<br/ translate="no"> Ich werde das jetzt natürlich überprüfen, aber höchstwahrscheinlich ist das der Fall... Ich habe "bid - TrailingStop * point" nicht normalisiert, und genau diese Konstruktion ist an der Auftragsänderung beteiligt...
wir sind nicht aufmerksam, meine Herren ;)

die Normalisierung hat nicht geholfen =(
genauer - Nachlauffehler (Euro - Kaufposition):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
(Serverzeit)
 
Entschuldigung, ich meinte den Standard NormalizeDouble.

Renat, wie soll ich vorgehen?
Im Moment gibt es 3 Möglichkeiten:
1. if ( orderstoploss < ( bid - TrailingStop * point ) ) ersetzt durch if ( TrailingStop < ( bid -orderstoploss) / point )
2. Vergleichen Sie int, nicht double, mit Begun-Funktionen
3. Ändern Sie den Stop-Vorlauf ( nicht jeden Punkt, sondern nach n Spreads)
und natürlich deren Kombinationen.

Da die Software recht verantwortungsvoll ist, möchte ich gerne (! keine Garantie!) Empfehlungen zum Schreiben bekommen...
 
<br / translate="no"> Die Normalisierung hat nicht geholfen =(


Versuchen Sie es stattdessen:
if (orderstoploss < ( bid - TrailingStop * point ))


schreiben:

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



Wird es auch Fehler geben?

 
Nun, wenn " + Punkt" Ich weiß nicht ... aber eigentlich habe ich die gleiche Sache jetzt ...
Es ist klar, dass man eine Gegenreaktion machen kann, aber es ist nicht ernst.... Und wenn ich eine 10-20 Pips Spielraum machen muss, "für die Zuverlässigkeit", ja, auf M30, nur ein Märchen =)
 
Renat, wie soll es weitergehen?

Bitte überprüfen Sie Ihren Code noch einmal, vereinfachen Sie ihn, fügen Sie Debug-Meldungen ein.
 
Bitte überprüfen Sie Ihren Code noch einmal, vereinfachen Sie ihn, fügen Sie Debug-Meldungen ein.


Um ehrlich zu sein, weiß ich nicht, wie ich es vereinfachen soll...
Aber Sie können es natürlich überprüfen. Hier ist der Code, wie er jetzt verwendet wird (in Teilen):

check incoming parameters and select required order. Wenn ein Fehler auftritt, werden wir einfach verlassen, d.h. der Auftrag wird nicht geändert...
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);
	}



Speichern Sie alle Auftragsdaten in Variablen und normalisieren Sie sie:

	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;




das ist die Farbe und "Schönheit" des Holzes...

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



jetzt für eine Long-Position ein neues SL-Level definieren, es normalisieren und mit dem alten vergleichen (nur wenn die Position profitabel ist)

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


in das Protokoll einfügen

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



ein dreifacher Versuch, die Bestellung nach einer 10-Sekunden-Pause zu ändern (die Bestellung wird jedes Mal hervorgehoben)

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


und nur wenn ordermodify <= 0 wird ein Fehlercode gesendet

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


wenn nach 3 Versuchen der Auftrag nicht geändert wurde, wird der Vorgang abgebrochen (-1)

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


dann das Gleiche für Verkaufspositionen

 	if ( _OrderType == OP_SELL )
	{
	}


und schließlich, wenn keine Notwendigkeit besteht, die Haltestelle zu ändern, exit(0)

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





Ich weiß es nicht....

 
<br / translate="no"> Verständlicherweise ist es möglich, eine Gegenreaktion zu erzeugen, aber es ist nicht seriös.... Und wenn wir einen Backlash von 10-20 Pips machen müssen, "für die Zuverlässigkeit", ja auf M30, nur ein Märchen =)


Was hat das mit der Sache zu tun? Mit "+Point" wird das Problem der Rundung der letzten signifikanten Stelle des Preises gelöst. Wir sprechen hier nicht von 2, 3 und erst recht nicht von 10-20 Pips.