Сетка виртуальных ордеров
Для этого надо написать простенький советник на 30 строчек. Это если ордер один.
написал по принципу
if (Ask == NormalizeDouble(GlobalVariableGet("Ask_"),Digits) + NormalizeDouble(1*Point,Digits) && F_Open()){ // F_Open() проверяет или есть на этом уровне раньше установленный ордер Alert ("Try to open BUY 0.04"); NewLevelOrder(OP_BUY, 0.04); // открываю } bool F_Open() { bool OpenNewOrder = true; for (int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if(OrderOpenPrice() == Bid || OrderOpenPrice() == Ask) OpenNewOrder = false; //break; } Alert ("Order already exist Pirce ",OrderOpenPrice()," OrderType ",OrderType()," OrderLots ",OrderLots()); return(OpenNewOrder); }
но он пропускает некоторые ордера... не выставив их в нужном месте :) алгоритм ошибки не прослеживается :)
написал по принципу
но он пропускает некоторые ордера... не выставив их в нужном месте :) алгоритм ошибки не прослеживается :)
Ask == А если не будет такой котировки? первая котировка 1,1234 Вторая 1,1237 А нам нужно купить по 1,1235. Поэтому и пропускает
Evgeny Belyaev:
Ask == А если не будет такой котировки? первая котировка 1,1234 Вторая 1,1237 А нам нужно купить по 1,1235. Поэтому и пропускает
Верно. Приведу код из своего скальпера, он близок к теме. Смысл - не открывать кучу ордеров с близкими ценами открытия.
// функция ищет открытые ордера вблизи текущей цены, нужна для того, чтобы не открывать несколько ордеров рядом с ценой // если ордер найден - возвращает true, иначе false bool NearOrderExist(string symbol, int cmd, int magic, double price = 0) { if(price==0) { if(OP_BUY == cmd) price = MarketInfo(symbol, MODE_ASK); if(OP_SELL == cmd) price = MarketInfo(symbol, MODE_BID); } int total = OrdersTotal(); for(int n = 0; n < total; n++) if(OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() == magic && OrderSymbol() == symbol && OrderType() == cmd) { if(MathAbs(OrderOpenPrice() - price) < m_priceStep) // m_priceStep - поле класса return true; } } return false; }