エラー番号6 - ページ 8

 
解剖の結果、エラーコード139の使い方が間違っていることが判明しました。実際は「取引コンテキストがビジー状態」であり、何らかの理由で特別なコードが設定されていませんでした。同様の問題は、本日英語フォーラム「Trade Dispatcher: all trade context is busy」で議論されました。
すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数にセマフォの独自のシステムを構築することです。
4つのEAを4分間に走らせたが、10分間に139のエラーが7回発生した。
 
解剖の結果、エラーコード139の誤用が判明しました。実際は「trade context is busy」であり、なぜか特別なコードはありません。"Trade Dispatcher: all trade context is busy"
すべてのEAに1つの取引コンテキストしかありません。正しい解決策は、グローバル変数に独自のセマフォシステムを構築することです。
4つのEAを10分間に7回エラー139回で動かしています。


このセマフォのシステムはどうあるべきか、少なくとも一般論として教えていただけませんか?
1.特に、他の人の邪魔にならないように、どのように取引を行うべきか。
2.スリップ、チェック、タイムアウト(マルチスレッドMTでは無いと約束されていたのに、さぁ)

そして最後に。これを叱咤激励と受け取らないでください。教科書があるじゃないですか。その中で、専門家の意見が述べられています。そこにあるセマフォを見せてください。

これが私の専門家です。20ルーブルのパンツのようにシンプルです。1時間ごとにポジションを反転させる。もしあなたが本当にトレーダーやブローカーの利益のことを考えるなら(私は人のことはわかりませんが、まず安定して動くEAを手に入れ、それからデモからリアルに切り替えたいと思っています)、私のこのEAの例で、どうすれば正しいのかを示してください。

敬具
クオーク

追伸:時々現れるエラー2、6、138、4109の起源については、まだ未解決です。
 
<br / translate="no">同様の問題を今日、英語フォーラムで議論しました"Trade Dispatcher: all trade context is busy".


英文スレッドを読ませていただきました。ああ...この人たちは、緊急にロシア語を勉強する必要があります。
似ているのではなく、同じ問題なのです。確かに、エラー2、6、138、4109はまだ出てないですね。139の話だけだった。

正直、IsTradeAllowedの意味がわからない。スラバ氏自身が、10個のExpert Advisorにこの機能を使わせて、突然取引を開始すると、最初の1個を除く全員がダメになることを説明しました。

それよりも、リクエストをキューに溜め、しばらく放置し、実行されるか削除されるようにする方がずっと良いだろう。でも、これは全部夢なんです。

そうではなく、例えばグローバル変数 nTrading を作成し、そこに Expert Advisor の名前を格納する必要があります。また、他のEAはどうすればいいのでしょうか?保留中の注文を持つMT3に戻るそれとも、他のアイデアがあるのでしょうか?

ちなみに、グローバル変数がなくても、次のようなことは可能です。

if(nPending == OP_BUY) nPending = Buy()、 else if(nPending == OP_SELL) nPending = Sell()です。



ここで、Buy() と Sell() は、失敗すると OP_BUY / OP_SELL を、成功すると -1 を返します。

デメリットは明らかで、ブローカーは1つの注文ではなく、10個のオープン(クローズ)注文を受け取ることになる。自動であれば、すべて問題ありません。もし、それが人間であれば-怒られるでしょう。さらに悪いことに、オートマトンと人間が異なる論理に従って行動している場合。例えば、オートマトンには待ち行列がない(スラバが説明してくれたように、1つのスレッドで、待ち行列を形成する代わりに命令が競合する)し、人間にはある。そして、そのトレーダーは本番で取引を始めますが、その理由すら理解できません。なぜなら、彼は(私 - アルパリのセミナーでのプレゼンテーションで)デモと本番には違いがないと断言されたからです。

2つ目のオプションは、エキスパートと通貨にそれぞれ独自のMnを割り当て、エキスパートアドバイザーと通貨の組み合わせが一意になるようにします。そして、バーが開いてから1秒後にIM1のEAが、7秒後にIM7のEAが取引されるようにコードを記述します。これにより、システムは1秒間の取引を行うことができます。

Slavaに質問 - 問題を回避するには、2番目でいいのでしょうか?

デメリットは明白で、スキャルパー - ピプサーはそれらについて教えてくれるでしょう :)

開発者の皆様へ(all-all)。分かりやすい説明ありがとうございます。この記事と過去の記事には、まだ未解決の部分があります。答えを待っている。

クオーク




 
そしてもう一つ質問です。現在議論されている状況は、ストップ・オー ダーのことを指しているのでしょうか?専門家はその実行力を競うのか?
 
//+------------------------------------------------------------------+
//|                                                    TestQuark.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
string SemaphoreName="TradeSemaphore";

//////////////////
int init ()
{
   if(!GlobalVariableCheck(SemaphoreName)) GlobalVariableSet(SemaphoreName,0.0);
	
	timePrev = 0;

	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
		nMagic = 2;
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
		nMagic = 5;
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
		nMagic = 7;
	else if(Symbol() == "AUDUSD")
		nMagic = 8;
	else if(Symbol() == "EURGBP")
		nMagic = 9;
	else if(Symbol() == "USDCAD")
		nMagic = 10;
	else if(Symbol() == "EURCHF")
		nMagic = 11;
	else if(Symbol() == "EURAUD")
		nMagic = 12;
		
	timePrev += nMagic;	// Open nMagic seconds after the new bar

	return(0);	
}

// ------

int deinit()
{
	return(0);
}
// ------
int start()
{
	if(Bars < 5)
		return(0);
	
	// The previous bar just closed
	bool bIsBarEnd = false;
	if(timePrev != Time[0] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

	bool bSemaphored=false;
   while(!IsStopped())
     {
      if(GlobalVariableGet(SemaphoreName)==0.0)
        {
         GlobalVariableSet(SemaphoreName,1.0);
         bSemaphored=true;
         break;
        }
      Sleep(1000);
     }

	if(nSignal == OP_BUY) 
		Buy();
	else if(nSignal == OP_SELL) 
		Sell();

	for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);

		if(OrderMagicNumber() == nMagic)
		{
			if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60)
			{
				if(OrderType() == OP_BUY)
					OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
				else if(OrderType() == OP_SELL)
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
			}
		}
	}

	if(bSemaphored) GlobalVariableSet(SemaphoreName,0.0);	

	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 
		0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", " + nError);
	}
}
// ------
void Buy()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 
		0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", " + nError);
	}
}
// ------

double GetLotSize()
{
	double dLot = 0.1;
	
	return(dLot);
}

// ------

int GetSignal()
{
	int nSignal;
	if(MathMod(Hour(), 2) == 0)
		nSignal = OP_BUY;
	else
		nSignal = OP_SELL;
		
	return(nSignal);
}

//+------------------------------------------------------------------+


グローバル変数 がある値を持っている場合に、その値を設定 する関数を作る場合、 のような構成はありません。

      if(GlobalVariableGet(SemaphoreName)==0.0) { GlobalVariableSet(SemaphoreName,1.0); bSemaphored=true; break; }.


であれば、100%信頼できる のようなものです。

      if(GlobalVariableSetOnCondition(SemaphoreName,1.0,0)==true) { bSemaphored=true; break; } { bSemaphored=true?




 
そしてもう一つ質問です。現在議論されている状況は、ストップ・オーダーのことを指しているのでしょうか?Expert Advisorは、その執行を競うのか?

いいえ、停止はサーバーで実行されます。
 
そうではなく、例えばグローバル変数nTradingを作り、そこに現在取引しているExpert Advisorの名前を書き込む必要があるのです。また、他のEAはどうすればいいのでしょうか?保留中の注文を持つMT3に戻るそれとも他のアイデアがあるのでしょうか?
私個人としては、トレードの間に必須のポーズがあります(調整可能、現在は30秒)。これは、利益を得るための障害にはなりませんが、同じような状況を避けるためのものです。グローバル変数で実装されています。セマフォとポーズ - 2 in 1 =)

また、キューについてですが、ファイルに書かれた 注文を実行するEAを作ろうと思いつきました。そして、他のすべての専門家は、このファイルに命令を書き込むだけです。
でも、私にとっては(有能なインプリメンテーションという意味で)とても簡単なことではないのです......。でも、やってみることは可能です。共通の努力で =))
 
ありがとうございます :)

これは私が理解できなかった一節です:

<br/ translate="no"> もし、グローバル変数が特定の値を持っている場合に、その値を設定する関数を作って、コンストラクトが起きないようにする

if(GlobalVariableGet(SemaphoreName)==0.0)
{
GlobalVariableSet(SemaphoreName,1.0);
bSemaphored=true;
break;
}


さて、この事件のロジックについて。おせっかいで申し訳ないんですが...私が正しく理解していれば、セマフォを何とか設定するまで、whileループに座っていることになります。そうだろ?そして、私たち以外誰も取引していないことを知りながら、取引をする。そして、セマフォを元の状態に戻す。質問:while(!IsStopped())はどのように動作するのですか??Allow Live Tradingのチェックかと思った。質問:それらのwhileやsleepは、システムにラグを発生させないのでしょうか?質問:







テスト モードでSleepやセマフォは正しく処理されますか?もうひとつ、論理的な質問をします。セマフォの設定と削除の間に、命令を処理するための2つの(最大)可能性があります。まずBuy()またはSell()、そしてその下にCloseOrder()があります。EA内部ではありますが、この2つの「活動」は、あたかも2つのExpert Advisorがあるかのように競合しないのでしょうか?それとも、処理は線形であることが保証されており、Buy()が戻るまでCloseOrder()に到達しないのでしょうか?よろしくお願いします。クオーク
 
И еще один вопрос. Относится ли обсуждаемая ситуация к стоп ордерам? Конкурируют ли эксперты за их исполнение?

ストップはサーバーで処理されます。また、当社の場合、お客様の専門的な取引フローに競争があります。


言い間違えました。ShouldOrderSend(OP_BUYSTOP...また、セマフォの設定と削除を行うコードで囲むのですか?バカな質問ですね。もちろん、そうすべきです。
 
eur - m15に、4ページ目の1番目の投稿に掲載されているExpert Advisorを添付してみました。
トレード機能を再構築し(ライブラリを接続)、別のeuram - m15に取り付けました。メイジッチはもちろん、変化しています。

どうなったかはまたお知らせします;)