専門家集団 - ページ 4

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

3人が見ていた =)) レナートが来て、ただ指をエラーに指していた =)))
もちろん今確認しますが、それが問題なのでしょう・・・。bid - TrailingStop * point」を正規化しておらず、まさにこの構造が注文修正に関与しているのですが...。
我々は、気配り、紳士ではない;)


そこで、何人かの方から、この問題のバリエーションをご提案いただきました。入札は小数点以下が5桁になる可能性があると書いた私でさえ、そのようなことがありました。最初はあり得ないと思ったのですが、おそらく複数のデータフィードから引用して、何らかのアルゴリズムで平均化するオートマトンによって、引用が行われていることを思い出しました。
 
入札は小数点以下が5桁になると書いた私でも最
初は
あり得ないと思って
いました
Bid/Askは一義的に標準的な記号の精度を持っています。もうひとつは、1.6666の代わりに1.6665999と表示されることがあります(浮動小数点数の誤差のため)。

このような数値(double型)の比較の問題は、すべての言語に存在し、この種の算術の基本的な精度が限られていることの結果であることに注意したい。そのため、誰かのせいにするのではなく、問題を自覚し、保護されたコードを書くことが必要です。
 
Даже я писал , что bid может иметь 5 знаков после запятой. Я сначала думал, что такое невозможно

Bid/Askは明らかに標準的な文字精度である。もうひとつは、1.6666の代わりに1.6665999と表示されることがあります(浮動小数点演算の特殊性によるものです)。

このような数値(double型)の比較の問題は、すべての言語に存在し、この種の算術の基本的な精度が限られていることの結果であることに注意したい。それに対応して、誰かを責めるのではなく、問題意識を持ち、安全なコードを書くことが必要です。


だから、私は誰も責めてはいないんです。私は無意味にkomposterを尋ねたわけではありません - どの通貨のトレーリングが正しく動作しなかったか。MT3では、確かに円は小数点以下3桁まで表示された記憶があります。少なくとも、私は何度も見たことがあります。
 
3人が見ていた =) Renatが来て、ただエラーに指を指していた =)))<br/ translate="no"> 今、もちろん確認しますが、最も可能性が高いのはこのケースです......。bid - TrailingStop * point」を正規化しておらず、まさにこの構造が注文の変更に関与している...。
私たちは気配り上手ではありません。)

normalization didn't help =( より正確には - 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)
 
すみません、標準のNormalizeDoubleのことです。

レナート、どうすればいいんだ?
現時点では3つのオプションがあります。
1. if ( orderstoploss < ( bid - TrailingStop *point))) を if ( TrailingStop < ( bid -orderstoploss ) / point ) に置き換える
2. Begun 関数を使って double ではなく int を比較
3. Stop advance ( 毎ポイントではなく n スプレッド後 )
とそれらの組み合わせは勿論。

かなり責任のあるソフトなので、おすすめの書き方を教えて欲しいです(!保証ではありません!)。
 
<br / translate="no">正規化してもダメだった =(


代わりにやってみてください。
if (orderstoploss < ( bid - TrailingStop * point ))


を書きます。

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



エラーも出るのでしょうか?

 
まあ、" +Point"の場合は分かりませんが......実は私も今、同じことをやっています......。
バックラッシュを起こせるのは確かですが、本気ではないので...。そして、もし私が10-20pipsのバックラッシュをしなければならないとしたら、「信頼性のために」、そう、M30では、ただのおとぎ話です =)。
 
レナート とにかくどうやって進めればいいのか?

コードを再度確認し、簡略化し、デバッグメッセージを挿入してください。
 
コードを再度確認し、簡略化し、デバッグメッセージを挿入してください。


正直なところ、どう単純化すればいいのかわからない...。
でも、もちろん確認はできますよ。以下は、現在使われているコードです(部分的に):

受信パラメータをチェックし、必要な順序を選択します。エラーが発生した場合は、単に終了します。つまり、注文は変更されません。
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秒間の休止の後、3回の注文変更を試みる(注文はその都度ハイライトされる)

				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回試行した後、注文が変更されていなければ、終了する (-1)

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


なら、売りポジションも同じ

 	if ( _OrderType == OP_SELL )
	{
	}


そして最後にstopを変更する必要がなければexit(0)

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





わからなくもない

 
<br / translate="no">当然、バックラッシュを起こす可能性はありますが、深刻なものではありません...。そして、10-20pipsのバックラッシュをしなければならない場合、「信頼性のために」、M30ではい、ただのおとぎ話 =)。


これと何の関係があるのですか?"+Point" は、価格の有効数字下一桁を丸める問題を解決します。2、3、そして10~20pips程度では話にならない。