MT3: можно ли так разграничить ордера?

 
Эксперты с разных окон одного терминала пытаются одновременно входить в рынок.
Можно ли таким образом их разграничить?
LastTradeTime - время первого запроса или конечное время установки ордера?
If (CurTime-LastTradeTime) < 15 then Exit;
...
If (GetGlobalVariable("g1") == 1) then Exit;
SetGlobalVariable("g1", 1);
SetOrder
SetGlobalVariable("g1", 0);
...
 
Доступ к глобальным переменным синхронизированный.
Да, можно практически. Есть правда очень маленькая вероятность того, что между этими двумя строками влезет другой эксперт.
If (GetGlobalVariable("g1") == 1) then Exit;
SetGlobalVariable("g1", 1);
 
В MT4 как я понимаю (когда OrderSend работает c ожиданием) таких проблем возникать не должно?

Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.
 
В MT4 как я понимаю (когда OrderSend работает c ожиданием) таких проблем возникать не должно?

Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.

А потом бороться с дедлоками?
 
В MT4 как я понимаю (когда OrderSend работает c ожиданием) таких проблем возникать не должно?

Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.

А потом бороться с дедлоками?



Если юзверь не вызвал unlock - сам дурак. Других случаев я не вижу. ;)
 
Если юзверь не вызвал unlock - сам дурак. Других случаев я не вижу. ;)

А как же случай - "караул! эксперта в терминале подвис! что за глючный язык!" ?
(конечно же, через пяток перезапросов дополнительной информации, выяснится что человек в одном месте забыл разлочиться... но осадок то остался)
 
А как же случай - "караул! эксперта в терминале подвис! что за глючный язык!" ?

Ну если так рассуждать, так вообще ничего делать не надо.
Можно и сейчас подвис в скрипте устроить неудачно цикл написав.
Разницы никакой, кроме пожалуй того, что с блокировкой проще ошибку увидеть.
И кстати дидлок можно исключить (ИМХО) запретив вложенные локи.
 
Попробовал реализовать эту схему с глобальными переменными. Все равно пропускает на валютах с Instant Execution. Хоть и меньше.
 
Разтолкуйте мне плиз тогда такую вещь. Если 3 ордера ломанулись одновременно - то один из запросов проходит, другие возвращают unknown error in SetOrder.
Эта ошибка
1) Возвращается сервером?
2) Напрягает ли брокера?
 
Вот такая штука похоже работает. И работает очень надежно.
var: op(-1);
var: j(0), cnt(0);
var: tm(0), val("");
var: ftime(true);

array: sym[15](""), num[15](0);

if (ftime) then {
 	SetGlobalVariable("g2", 0);
	ftime = false;
	
	sym[0] = "***";
	sym[1] = "USDCHF";
	sym[2] = "GBPUSD";
	sym[3] = "USDJPY";
	sym[4] = "EURUSD";
	sym[5] = "AUDUSD";
	sym[6] = "USDCAD";
	sym[7] = "EURGBP";
	sym[8] = "EURCHF";
	sym[9] = "EURJPY";
	sym[10] = "GBPJPY";
	sym[11] = "GBPCHF";


	num["USDCHF"] = 1;
	num["GBPUSD"] = 2;
	num["USDJPY"] = 3;
	num["EURUSD"] = 4;
	num["AUDUSD"] = 5;
	num["USDCAD"] = 6;
	num["EURGBP"] = 7;
	num["EURCHF"] = 8;
	num["EURJPY"] = 9;
	num["GBPJPY"] = 10;
	num["GBPCHF"] = 11;

}

if (Period != 15) then {
	Alert(Symbol + ": period != M15");
	Exit;
}

If (CurTime-LastTradeTime) < 11 then Exit;
if (tm > 0 and CurTime - tm < 2) then Exit;

cnt = 0;
for j = 1 to TotalTrades {   
	if (Ord(j, VAL_SYMBOL) != Symbol) then Continue;
  if (Ord(j, VAL_TYPE) == OP_BUY) then cnt++;
  if (Ord(j, VAL_TYPE) == OP_SELL) then cnt++;
} 
 	
if (cnt >= 100) then Exit; 	



if (tm == 0) then {
	op = -1;  
	if (Mod(TimeSeconds(CurTime), 2) == 1) then op = OP_BUY else op = OP_SELL;

	if (op == OP_BUY) then {		
		if (GetGlobalVariable("g2") > 0) then Exit;
		SetGlobalVariable("g2", num[Symbol]);
		tm = CurTime;
		Exit;
 	}
 	
	if (op == OP_SELL) then {
		if (GetGlobalVariable("g2") > 0) then Exit;
		SetGlobalVariable("g2", num[Symbol]);
		tm = CurTime;
 		Exit;
	}
}

if (tm > 0) then {
	if (op == OP_BUY) then {
	  val = GetGlobalVariable("g2");
		Comment(sym[val]);
		if (val != num[Symbol]) then {
			tm = 0;
			Exit;
		}

 		SetOrder(OP_BUY, Lots, Ask, 3, Ask-StopLoss*Point, Ask+TakeProfit*Point, Red);
 		SetGlobalVariable("g2", 0);
 		tm = 0;
 		Exit;
	}
 	
	if (op == OP_SELL) then {
		val = GetGlobalVariable("g2");
		Comment(sym[val]);
		if (val != num[Symbol]) then {
			tm = 0;
			Exit;
		}

	 	SetOrder(OP_SELL, Lots, Bid, 3, Bid+StopLoss*Point, Bid-TakeProfit*Point, Red);
 		SetGlobalVariable("g2", 0);
 		tm = 0;
 		Exit;
 	}
}