실수 번호 6 - 페이지 8

 
부검 결과 오류 코드 139가 잘못 사용된 것으로 나타났습니다. 사실 "무역 상황이 바쁘다"는 이유로 특별한 코드가 없었습니다. 오늘 우리는 영어 포럼 "Trade Dispatcher: all trade context is busy" 에서 유사한 문제에 대해 논의했습니다.
모든 Expert Advisors에는 하나의 거래 스레드만 있습니다. 올바른 솔루션은 전역 변수에 자체 세마포어 시스템을 구축하는 것입니다.
4분 만에 4명의 Expert Advisors를 시작했습니다. 10분 동안 7번 오류 139
 
부검 결과 오류 코드 139가 잘못 사용된 것으로 나타났습니다. 사실 "무역 상황이 바쁘다"는 이유로 특별한 코드가 없었습니다. 오늘 우리는 영어 포럼 "Trade Dispatcher: all trade context is busy" 에서 유사한 문제에 대해 논의했습니다.
모든 Expert Advisors에는 하나의 거래 스레드만 있습니다. 올바른 솔루션은 전역 변수에 자체 세마포어 시스템을 구축하는 것입니다.
4분 만에 4명의 Expert Advisors를 시작했습니다. 10분 동안 7번 오류 139


최소한 일반적인 용어로 이 세마포어 시스템이 어떠해야 하는지 말씀해 주시겠습니까?
1. 특히, 타인에게 방해가 되지 않도록 거래를 하는 방법.
2. 슬립, 체크, 타임아웃(다중 스레드 MT에서는 약속되지 않았지만 오 잘)

그리고 마지막으로. 그것을 비난으로 받아들이지 마십시오. 교과서가 있습니까? 전문가가 포함되어 있습니다. 거기 있는 세마포어를 보여주세요.

여기 내 전문가가 있습니다. 루블 20의 속옷처럼 간단합니다. 매시간 위치를 돌립니다. 트레이더와 브로커의 수입이 정말 중요하다면(누가 신경쓰는지 모르겠지만 우선 안정적으로 일하는 Expert Advisor를 구한 다음 데모에서 실제로 전환하고 싶습니다) 이 Expert Advisor의 예를 사용하여 내 것, 그것을 올바르게 수행하는 방법을 보여줍니다.

감사합니다,
쿼크

추신 때때로 나오는 오류 2, 6, 138 및 4109의 기원에 대한 질문은 여전히 열려 있습니다.
 

오늘 우리는 영어 포럼 "Trade Dispatcher: all trade context is busy" 에서 유사한 문제에 대해 논의했습니다.


나는 영어 스레드를 읽었다. 예... 이 사람들은 러시아어를 급히 배워야 합니다.
비슷하지 않고 같은 문제입니다. 사실, 그들은 아직 오류 2, 6, 138 및 4109를 받지 못했습니다. 약 139개에 불과했다.

솔직히 말하면 IsTradeAllowed에서 요점을 알 수 없습니다. Slava 자신은 10명의 Expert Advisors가 이 기능에서 어떻게 진행되는지 설명했습니다.

요청 대기열을 만드는 것이 훨씬 낫습니다. 요청 대기열은 요청이 누적되어 잠시 동안 유지되고 실행되거나 삭제됩니다. 그러나 이것들은 모두 꿈입니다.

오히려 예를 들어 글로벌 변수 nTrading을 생성하고 현재 거래 중인 Expert Advisor의 번호를 입력해야 합니다. 논리적인 질문 - 나머지 전문가들은 어떻게 해야 합니까? 보류 중인 주문과 함께 MT3로 다시 돌아가거나... 아니면 다른 아이디어가 있습니까?

그건 그렇고, 전역 변수 없이도 가능합니다.

if(nPending == OP_BUY)
    nPending = 구매();
else if(nPending == OP_SELL)
    nPending = 판매();



여기서 Buy() 및 Sell()은 실패 시 OP_BUY / OP_SELL을 반환하고 성공 시 -1을 반환합니다.

단점은 명백합니다. 브로커는 1개가 아닌 10개의 개설(마감) 주문을 받습니다. 자동이면 모든 것이 정상입니다. 사람이라면 화를 낼 것입니다. 기계와 사람이 다른 논리에 따라 행동하면 더 나쁩니다. 예를 들어, 자동 장치에는 대기열이 없지만(Slava가 우리에게 설명했듯이 대기열에 줄을 서지 않고 하나의 흐름이 있고 주문이 경쟁합니다) 사람이 있습니다. 그런 다음 실생활에서 거래를 시작한 상인은 소진되고 그 이유를 이해하지 못할 것입니다. 왜냐하면 (저 - Alpari의 프레젠테이션 세미나에서) 데모와 실제 사이에 차이가 없다고 확신했기 때문입니다.

두 번째 옵션 - 각 전문가와 통화에 고유 번호가 할당되어 전문가 + 통화의 조합이 고유합니다. 그런 다음 승수 1을 가진 전문가가 첫 번째 초에 거래하고 승수 7을 사용하여 일곱 번째 등으로 거래하는 방식으로 코드를 작성합니다. 바가 열린 후. 이것은 시스템이 거래할 시간을 줄 것입니다.

Slava에 대한 질문 - 문제를 피하기에 두 번째로 충분합니까?

단점은 명백합니다. 스캘퍼 - 파이퍼가 그에 대해 알려줄 것입니다. :)

친애하는 개발자 (그리고 모든 것). 명확하게 해 주셔서 감사합니다. 이 게시물과 이전 게시물에 답이 없는 질문이 있습니다. 답변을 기다리고 있습니다.

쿼크




 
그리고 질문 하나 더. 논의 중인 상황이 중지 명령 에 적용됩니까? 전문가들은 실행을 위해 경쟁합니까?
 
//+------------------------------------------------------------------+
//|                                                    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(세마포어 이름)==0.0)
        {
         GlobalVariableSet(세마포어 이름, 1.0);
         bSemaphored=참;
         부서지다;
        }


그러면 100% 신뢰성이 있을 것입니다
뭔가

      if(GlobalVariableSetOnCondition(세마포 이름, 1.0, 0.0)==true)
        {
         bSemaphored=참;
         부서지다;
        }
 
그리고 질문 하나 더. 논의 중인 상황이 중지 명령에 적용됩니까? 전문가들은 실행을 위해 경쟁합니까?

아니요. 중지는 서버에서 처리됩니다. 그리고 우리의 경우 클라이언트의 전문적인 거래 흐름에 대한 경쟁이 있습니다.
 
즉, 예를 들어 글로벌 변수 nTrading을 생성하고 현재 거래 중인 Expert Advisor의 번호를 입력해야 합니다. 논리적인 질문 - 나머지 전문가들은 어떻게 해야 합니까? 보류 중인 주문과 함께 MT3로 다시 돌아가거나... 아니면 다른 아이디어가 있습니까?
개인적으로, 나는 거래 사이에 필수 일시 중지가 있습니다(조정 가능, 현재 30초). 수익성 있는 거래의 경우 이것은 거의 장애물이 아니지만 이러한 상황에서 보호합니다. 전역을 통해 구현됩니다. 변하기 쉬운. 세마포어 및 일시 중지 - 2 in one =)

대기열에 관해서는 에 기록된 주문을 실행하는 Expert Advisor를 만들 생각이 있었습니다. 그리고 다른 모든 전문가들은 이 파일에 명령을 씁니다.
그러나 나처럼 (유능한 구현의 의미에서) ... 그러나 당신은 시도 할 수 있습니다. 함께 =))
 
감사해요 :)

나는 이 구절을 이해하지 못했다:


전역 변수의 값을 설정하는 기능을 만들면 이 변수에 특정 값이 있어야 구성이 없습니다.

if(GlobalVariableGet(세마포어 이름)==0.0)
{
GlobalVariableSet(세마포어 이름, 1.0);
bSemaphored=참;
부서지다;
}


이제 이 경우의 논리에 대해 알아보겠습니다. 찔러서 죄송합니다만...

내가 올바르게 이해했다면 세마포어를 설정할 수 있을 때까지 while 루프에 앉아 있습니다. 그래서? 그런 다음 우리는 우리 외에는 아무도 거래하지 않는다는 것을 알고 거래합니다. 그런 다음 세마포어를 원래 상태로 되돌립니다.

질문: while(!IsStopped())는 어떻게 작동합니까? 도움말에서 완전히 명확하지 않지만 라이브 거래 허용에 대한 수표라고 생각했습니다.

질문: 이 동안과 절전 모드는 시스템 속도를 늦추지 않습니까?

질문: 절전 모드와 세마포어가 테스트 모드 에서 올바르게 처리됩니까?

더 논리적입니다. 세마포어를 설정하고 제거하는 사이에 주문을 처리할 수 있는 최대 두 번의 기회가 있습니다. 먼저 Buy() 또는 Sell()을 수행한 다음 아래에 CloseOrder()를 수행합니다. 이 두 "활동"은 전문가 내에서도 서로 경쟁하지 않을 뿐만 아니라 마치 두 명의 전문가가 있는 것처럼 경쟁하지 않을까요? 아니면 프로세스가 선형으로 보장되고 Buy()가 반환될 때까지 CloseOrder()가 거기에 도달하지 않습니까?

미리 감사드립니다.
쿼크
 
И еще один вопрос. Относится ли обсуждаемая ситуация к стоп ордерам? Конкурируют ли эксперты за их исполнение?

아니요. 중지는 서버에서 처리됩니다. 그리고 우리의 경우 클라이언트의 전문적인 거래 흐름에 대한 경쟁이 있습니다.


제가 표현을 잘못했습니다. OrderSend (OP_BUYSTOP...도 세마포어를 설정하고 제거하는 코드로 둘러싸여 있어야 합니까? 어리석은 질문입니다. 물론 그래야 합니다.
 
유로 - m15에 4 페이지의 첫 번째 게시물에 게시 된 전문가를 첨부했습니다.
나는 거래 기능을 다시 실행하고(내 라이브러리에 연결) 다른 유로인 m15에 매달았습니다. 마법, es-no, 변경되었습니다.

내일 무슨 일이 있었는지 말씀드리겠습니다 ;)