Uzman Danışmanlar Topluluğu - sayfa 4

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

3 kişi izledi =) Renat geldi ve yanlışa parmakla işaret etti =)))
Şimdi kontrol edeceğim elbette, ama büyük ihtimalle mesele bu... "Teklif - TrailingStop * noktası"nı normalleştirmedim ve bu yapı sipariş değişikliğiyle ilgili...
nedense dikkatsiziz beyler ;)


Yani birkaç kişiniz var ve sorunun böyle bir çeşidini sundunuz. Teklifin 5 ondalık basamağa sahip olabileceğini bile yazdım. İlk başta bunun imkansız olduğunu düşündüm, ama sonra alıntıların bir otomat tarafından yapıldığını hatırladım, belki de birkaç veri beslemesinden alıntılar alıyor ve bazı algoritmalara göre bunların ortalamasını alıyor.
 
Teklifin 5 ondalık basamağa sahip olabileceğini bile yazdım. İlk başta imkansız olduğunu düşündüm

Teklif/Soruşturma benzersiz bir şekilde standart sembol hassasiyetine sahiptir. Başka bir şey, 1.6666 yerine 1.6665999'u görebilmenizdir (kayan nokta sayılarıyla çalışma hatasının özelliklerinden dolayı).

Şunu belirtmek isterim: Bu tür sayıları karşılaştırma sorunu ( double türü ) tüm dillerde mevcuttur ve bu tür aritmetiğin temel sınırlı doğruluğunun bir sonucudur. Buna göre kimseyi suçlamaya gerek yok, sorunun farkında olmak ve güvenli kod yazmak.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Teklif/Soruşturma benzersiz bir şekilde standart sembol hassasiyetine sahiptir. Başka bir şey, 1.6666 yerine 1.6665999'u görebilmenizdir (kayan nokta sayılarıyla çalışma hatasının özelliklerinden dolayı).

Şunu belirtmek isterim: Bu tür sayıları karşılaştırma sorunu (çift tip) _tüm_ dillerdedir ve bu tür aritmetiğin temel sınırlı doğruluğunun bir sonucudur. Buna göre kimseyi suçlamaya gerek yok, sorunun farkında olmak ve güvenli kod yazmak.


Bu yüzden suçlamıyorum. Kompostere, takip eden para biriminin doğru çalışmadığını sormam boşuna değildi. Yen'deki MT3'te 3 ondalık basamak görebileceğinizi tam olarak hatırlıyorum. En azından bir kereden fazla gördüm.
 
3 kişi izledi =) Renat geldi ve yanlışa parmakla işaret etti =)))
Şimdi kontrol edeceğim elbette, ama büyük ihtimalle mesele bu... "Teklif - TrailingStop * noktası"nı normalleştirmedim ve bu yapı sipariş değişikliğiyle ilgili...
nedense dikkatsiziz beyler ;)

normalleştirme yardımcı olmadı =(
daha kesin olmak gerekirse - takip eden hatalar (euro - satın alma pozisyonu):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
( sunucu zamanı )
 
Üzgünüm, standart NormalizeDouble'ı kastettim.

Renat ve henüz ne yapmalı?
Şu anda 3 seçenek var:
1. if ( orderstoploss < ( bid - TrailingStop * puan )) ) if ( TrailingStop < ( bid - orderstoploss ) / puan ) ile değiştirin
2. Başlatma işlevlerini kullanarak double değil, int ile karşılaştırın
3. stopu ileri hareket ettirin (her noktada değil, n yayıldıktan sonra)
Eh, ve onların kombinasyonları, elbette.

Yazılım oldukça sorumlu olduğu için, yazmak için (! garantisi yok!) Öneriler almak istiyorum...
 

normalleştirme yardımcı olmadı =(


Bunun yerine deneyin:
if (orderstoploss < ( bid - TrailingStop * point ))


yazmak:

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



Hatalar da olacak mı?

 
peki, eğer " + Nokta "yı bilmiyorsam... ama genel olarak şu anda bende aynısı var...
bir ters tepme yapabileceğiniz açıktır, ancak bu ciddi değildir .... ve "güvenilirlik için" 10-20 piplik bir boşluk yapmanız gerekiyorsa, evet, M30'da bir peri masalı basittir = )
 
Renat ve henüz ne yapmalı?

Lütfen kodunuzu tekrar kontrol edin, basitleştirin, hata ayıklama mesajları ekleyin.
 
Lütfen kodunuzu tekrar kontrol edin, basitleştirin, hata ayıklama mesajları ekleyin.


Dürüst olmak gerekirse, bunu nasıl yapacağımı bilmiyorum...
Ama tabi ki kontrol edebilirsiniz. Şu anda kullanıldığı şekliyle kod (parçalar halinde):

gelen parametreleri kontrol edin ve gerekli sırayı seçin. Bir hata durumunda, basitçe çıkarız, yani. sıralama değişmeyecek...
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);
	}



Tüm sipariş verilerini değişkenlere kaydediyor ve normalleştiriyoruz:

	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;




kütüğün rengi ve "güzelliği" budur...

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



şimdi, uzun bir pozisyon için yeni bir SL seviyesi belirliyoruz, normalleştiriyoruz, eskisiyle karşılaştırıyoruz (sadece pozisyon karlıysa)

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


günlüğe bilgi yazdır

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



10 saniyelik bir duraklama ile sırayı değiştirmeye yönelik üçlü deneme (sipariş her seçildiğinde)

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


ve yalnızca ordermodify <= 0, hata koduyla posta gönderilirse

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


3 denemeden sonra sipariş hala değiştirilmediyse, çık(-1)

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


ayrıca - satış pozisyonları için de

 	if ( _OrderType == OP_SELL )
	{
	}


ve son olarak, durağı hareket ettirmeye gerek yoksa, çıkış (0)

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





Bilmiyorum....

 

bir ters tepme yapabileceğiniz açık, ancak bu ciddi değil .... ve "güvenilirlik için" 10-20 piplik bir boşluk yapmanız gerekiyorsa, evet, M30'da bir peri masalı basittir = )


Ne alakası var? "+Puan", sorunu son önemli fiyat işaretini yuvarlayarak çözer. 2, 3 ve hatta daha fazla değil, sorunun 10-20 puanı.