전문가 자문 커뮤니티 - 페이지 4

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

3명이 시청했습니다 =) Renat이 와서 실수를 손가락으로 가리켰습니다 =)))
물론 지금 확인해 보겠습니다만 아마 이게 요점일겁니다... "bid - TrailingStop * point"를 정규화하지 않았고, 이 구성은 오더 수정에 포함됩니다...
어떻게 든 우리는 부주의합니다, 여러분;)


그래서 당신은 몇 사람이 있고 문제의 그러한 변형을 제안했습니다. 심지어 입찰가는 소수점 이하 5자리까지 가능하다고 썼습니다. 처음에는 이것이 불가능하다고 생각했지만 따옴표는 아마도 여러 데이터 피드에서 인용문을 가져와 일부 알고리즘에 따라 평균화하는 자동 장치에 의해 만들어진다는 것을 기억했습니다.
 
심지어 입찰가는 소수점 이하 5자리까지 가능하다고 썼습니다. 처음에는 불가능하다고 생각했는데

Bid/Ask는 고유하게 표준 기호 정밀도를 갖습니다. 또 다른 것은 1.6666 대신 1.6665999를 볼 수 있다는 것입니다(부동 소수점 숫자 작업 시 오류의 특성으로 인해).

나는 이러한 숫자를 비교하는 문제( type double )가 _모든_ 언어에 존재하며 이러한 유형의 산술의 근본적으로 제한된 정확도의 결과라는 점에 주목하고 싶습니다. 따라서 누구를 탓할 필요 없이 문제를 인지하고 안전한 코드를 작성해야 합니다.
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Bid/Ask는 고유하게 표준 기호 정밀도를 갖습니다. 또 다른 것은 1.6666 대신 1.6665999를 볼 수 있다는 것입니다(부동 소수점 숫자 작업 시 오류의 특성으로 인해).

저는 이러한 숫자를 비교하는 문제(유형 이중)는 _모든_ 언어에서 발생하며 이러한 유형의 산술의 근본적으로 제한된 정확도의 결과입니다. 따라서 누구를 탓할 필요 없이 문제를 인지하고 안전한 코드를 작성해야 합니다.


그래서 나는 비난하지 않습니다. 내가 komposter에게 후행이 올바르게 작동하지 않는 통화를 물은 것은 헛되지 않았습니다. 나는 엔화의 MT3에서 소수점 3자리를 볼 수 있다는 것을 정확히 기억합니다. 적어도 나는 그것을 한 번 이상 보았다.
 
3명이 시청했습니다 =) Renat이 와서 실수를 손가락으로 가리켰습니다 =)))
물론 지금 확인해 보겠습니다만 아마 이게 요점일겁니다... "bid - TrailingStop * point"를 정규화하지 않았고, 이 구성은 오더 수정에 포함됩니다...
어떻게 든 우리는 부주의합니다, 여러분;)

정규화가 도움이 되지 않았습니다 =(
더 정확하게 - 후행 오류(유로 - 매수 포지션):
03:41
12:07
12:11
14:31
14:33
14:36
14:39
14:44
14:46
14:47
14:48
( 서버 시간 )
 
죄송합니다. 표준 NormalizeDouble을 의미했습니다.

Renat, 아직 무엇을 해야 합니까?
현재 3가지 옵션이 있습니다.
1. if ( orderstoploss < ( bid - TrailingStop * point )) ) if ( TrailingStop < ( bid -orderstoploss) / point )
2. double이 아닌 int를 시작 함수를 사용하여 비교합니다.
3. 정지점을 앞으로 이동합니다(모든 지점이 아니라 n번 스프레드 후).
글쎄, 그리고 그들의 조합은 물론입니다.

소프트웨어는 상당한 책임이 있으므로 작성에 대한 권장 사항을 받고 싶습니다(! 보장 없음!)...
 

정규화가 도움이 되지 않았습니다 =(


대신 시도:
if (orderstoploss < ( bid - TrailingStop * point ))


쓰다:

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



오류도 발생할까요?

 
글쎄, 내가 " + Point "를 모른다면 ... 그러나 일반적으로 나는 지금 같은 것을 가지고 있습니다 ...
백래시를 만들 수 있다는 것은 분명하지만 심각한 것은 아닙니다.... 그리고 10-20핍의 백래시를 수행해야 하는 경우 "신뢰성을 위해" 그렇습니다. M30에서 동화는 간단합니다 = )
 
Renat, 아직 무엇을 해야 합니까?

코드를 다시 확인하고 단순화하고 디버그 메시지를 삽입하십시오.
 
코드를 다시 확인하고 단순화하고 디버그 메시지를 삽입하십시오.


솔직히 어떻게 만드는지 모르겠습니다...
하지만 물론 확인할 수 있습니다. 다음은 현재 사용되는 코드입니다(부분적으로).

들어오는 매개변수를 확인하고 필요한 순서를 선택하십시오. 오류가 발생하면 간단히 종료합니다. 순서가 수정되지 않습니다...
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);
	}



모든 주문 데이터를 변수에 저장하고 정규화합니다.

	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;




이것이 통나무의 색과 '예쁨'...

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



이제 롱 포지션에 대해 새로운 SL 레벨을 결정하고 정규화하고 이전 포지션과 비교합니다(포지션이 수익성 있는 경우에만)

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


기록할 정보 인쇄

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



10초 간격으로 주문 수정을 세 번 시도(주문이 선택될 때마다)

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


ordermodify <= 0인 경우에만 오류 코드 가 포함된 메일이 전송됩니다.

					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번의 시도 후에도 순서가 여전히 수정되지 않으면 exit(-1)

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


추가 - 매도 포지션도 가능

 	if ( _OrderType == OP_SELL )
	{
	}


마지막으로 정류장을 이동할 필요가 없으면 exit(0)

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





모르겠어요....

 

백래시를 만들 수 있다는 것은 분명하지만 심각한 것은 아닙니다.... 그리고 10-20핍의 백래시를 수행해야 하는 경우 "신뢰성을 위해" 그렇습니다. M30에서 동화는 간단합니다 = )


그것은 무엇과 관련이 있습니까? "+Point"는 마지막 중요한 가격 기호를 반올림하는 문제를 해결합니다. 질문의 2, 3, 심지어 더 많은 10-20 포인트에 대해 아닙니다.