Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
2005.08.11 11:07:12 TradeDispatcher: all trade context is busy
Я этот советник отцепил, посмотрю что дальше будет.
Вот. Это оно и есть. Начинается. 139 - это order is locked. Кем, зачем - непонятно. Потом будут 2, 6, и еще до кучи.
Что самое обидное, в этом советнике ведь нет ничего такого, что отличает его от других. Значит, либо это "что-то" я не вижу в упор, либо глючить может любой советник, просто не у всех он должен срабатывать каждый час, соответственно, не все заметили.
Соответственно, вопрос ко всем - есть ли у вас в логах подобные записи?
Rosh, ты используешь Альпари? Если да, то вопрос к Альпари - у вас сервер работает нормально?
Что я выяснил за сегодняшнюю ночь :(
1. Советник сам по себе, ОДИН, работает, и либо ошибок не выдает, либо выдает их настолько редко, что ночи для этого недостаточно.
2. В сочетании с еще несколькими советниками (точнее, с одним, по шести валютам), ошибка воспроизвелась, правда, не через час, а через 4 часа.
Что отсюда следует?
1. Есть некий баг в МТ (или в моем советнике, но он настолько прост, что вряд ли), который иногда не позволяет открывать сделки. И закрывать, кстати, тоже.
Конечно, можно его обойти:
while(nResult == -1) { nResult = OrderSend(...); }Надо ли говорить, что это ОЧЕНЬ плохой стиль программирования, да и брокера можно обидеть...
2. Я сейчас переписываю эксперт, чтобы он был попроще, и в то же время вызывал ошибку. Выложу в ближайшие часы. Если окажется, что для ошибки нужны два эксперта, что поделать, выложу два :)
а мы будем проверять
Время Алерта и блокировки совпадает . Код советника вообще не глядел.
Как им пользоваться: для каждой из валют (EURUSD, EURJPY, USDCHF, GBPUSD, GBPJPY,
GBPCHF, USDJPY, AUDUSD, EURGBP, USDCAD, EURCHF, EURAUD) открываем часовой график.
К каждому графику по эксперту. Они не взаимодействуют, так как мн у всех разные.
Сразу же будут открыты позиции, по одной на график. В начале следующего часа позиции должны будут поменяться на противоположные, и т.д.
За раз у меня выскочило 2 ошибки, так что, в принципе, возможен вариант, когда придется подождать 2 часа.
Если у вас особые отношения с торговым сервером, лучше, наверное, использовать обычный аккаунт для теста. Я использую Альпари.
Также обратите внимание (полагаю, это независимый баг) на положение стрелочек открытия позиций. По идее, раз позиция открывается на новом баре, то и стрелка должна быть на нем же.
Ну и наконец, если вам неохота ждать час, откройте минутные графики. Ошибка воспроизводится.
Еще раз повторюсь, речь идет об ошибке 139. В то же время, этим способом мне пока не удалось получить ошибку 2 и 6. А раньше они в основном и были. Так что, видимо, будут еще посты.
double dStopLoss; int nHoursToHold; datetime timePrev = 0; int nSlip = 5; double dLotSize = 0.1; int nMagic = 0; ////////////////// int init () { 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; 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]) bIsBarEnd = true; timePrev = Time[0]; if(!bIsBarEnd) return(0); // ------ int nSignal = GetSignal(); if(nSignal == OP_BUY) Buy(); else if(nSignal == OP_SELL) Sell(); for(int nCnt = 0; nCnt < OrdersTotal(); 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); } } } 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(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(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); } // ------Время Алерта и блокировки совпадает . Код советника вообще не глядел.
Все бы хорошо, но я ввел алерты после того, как заметил, что сделки не совершаются. К тому же, алерт в коде сразу после OrderSend.
Сейчас попробую перейти на Print, но сомневаюсь что-то...
Поставил Print вместо Алерт, чтобы проверить предположение Rosh'a. Увы, вся разница в том, что теперь сообщения об ошибке 139 появляется в логе, а не на экране.
И такая вещь непонятная :
2005.08.11 13:08:12 '18708': close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
и далее
2005.08.11 13:08:13 '18708': order #680413 buy 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 closed at price 1.2408
то есть, сначала ордер идет без стопов и тейк-профитов, а потом вдруг появляется стоп-лосс в ордере
И такая вещь непонятная :
2005.08.11 13:08:12 '18708': close order #680413 buy 0.10 EURUSD at 1.2385 sl: 0.0000 tp: 0.0000 at price 1.2408
и далее
2005.08.11 13:08:13 '18708': order #680413 buy 0.10 EURUSD at 1.2385 sl: 1.2275 tp: 0.0000 closed at price 1.2408
то есть, сначала ордер идет без стопов и тейк-профитов, а потом вдруг появляется стоп-лосс в ордере
Если есть оттестированный кусочек кода, с удовольствием посмотрю на "через Bars" :)
Что касается нулевого стопа - я его присвоил в init, и больше нигде не меняю. Баг, наверное. Блин, с тех пор, как С++ забросил, не думал, что придется снова заниматься энтомологией.
На самом деле, ну эксперт, ну ладно. Но ведь он настолько прост, что возникает вопрос: а нет ли опасности, что другие эксперты также себя ведут? Да еще учитывая, что баг проявляется лишь когда экспертов много, да еще - что ошибки разные выдает.
Например, есть эксперт, использующий MACD + ADX + Stochastic. Протестировав его тестером (где серверных ошибок нет по определению), будет ли человек сидеть и проверять тупо "вот тут все условия выполнились, а сделка не совершена". Скорее всего, не будет... Опасный баг.
Если есть оттестированный кусочек кода, с удовольствием посмотрю на "через Bars" :)
Например, так:
int start() { int total,ticket,totalExpert; //---- SetTrace(); if (Bars>b) { b=Bars;А что такое SetTrace?