Доступ к глобальным переменным синхронизированный.
Да, можно практически. Есть правда очень маленькая вероятность того, что между этими двумя строками влезет другой эксперт.
Да, можно практически. Есть правда очень маленькая вероятность того, что между этими двумя строками влезет другой эксперт.
If (GetGlobalVariable("g1") == 1) then Exit;
SetGlobalVariable("g1", 1);
SetGlobalVariable("g1", 1);
В MT4 как я понимаю (когда OrderSend работает c ожиданием) таких проблем возникать не должно?
Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.
Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.
А потом бороться с дедлоками?
В MT4 как я понимаю (когда OrderSend работает c ожиданием) таких проблем возникать не должно?
Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.
Можно было бы добавить команды lock/unlock, которые бы останавливали/запускали работу экспертов в соседних окнах.
А потом бороться с дедлоками?
Если юзверь не вызвал unlock - сам дурак. Других случаев я не вижу. ;)
Если юзверь не вызвал unlock - сам дурак. Других случаев я не вижу. ;)
А как же случай - "караул! эксперта в терминале подвис! что за глючный язык!" ?
(конечно же, через пяток перезапросов дополнительной информации, выяснится что человек в одном месте забыл разлочиться... но осадок то остался)
А как же случай - "караул! эксперта в терминале подвис! что за глючный язык!" ?
Ну если так рассуждать, так вообще ничего делать не надо.
Можно и сейчас подвис в скрипте устроить неудачно цикл написав.
Разницы никакой, кроме пожалуй того, что с блокировкой проще ошибку увидеть.
И кстати дидлок можно исключить (ИМХО) запретив вложенные локи.
Попробовал реализовать эту схему с глобальными переменными. Все равно пропускает на валютах с Instant Execution. Хоть и меньше.
Разтолкуйте мне плиз тогда такую вещь. Если 3 ордера ломанулись одновременно - то один из запросов проходит, другие возвращают unknown error in SetOrder.
Эта ошибка
1) Возвращается сервером?
2) Напрягает ли брокера?
Эта ошибка
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; } }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Можно ли таким образом их разграничить?
LastTradeTime - время первого запроса или конечное время установки ордера?