Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 59 из 87 ПерваяПервая ... 949575859606169 ... ПоследняяПоследняя
  1. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от Денис Давыдов Посмотреть сообщение
    Ну это конечно извращение :) историю счёта совсем загадите. Для информации: в Броко на демо максимум 100 ордеров вместе с отложниками может быть открыто, на реале без ограничений.
    Согласен: извращение! Иногда эту информацию нужно из брокеров выуживать. Неплохо самому сразу видеть. Остальные-то параметры счета можно определить - спрэд, заморозку, максимальный и минимальный лот и т.д.
    Причем на демо - одно, открываешь реальный счет - опа: максимальный лот - другой, количество открытых и отложенников - другое и т.д.

    Может какой-то виртуальный запрос на сервер, который вернет это значение. Подскажите, кто с этим сталкивался?!
  2. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от religare777 Посмотреть сообщение
    Может какой-то виртуальный запрос на сервер, который вернет это значение. Подскажите, кто с этим сталкивался?!
    Я об этом не слышал ни когда, скорее всего нет такой возможности, только через техпо.
  3. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от religare777 Посмотреть сообщение
    5 баллов!!! :thumbsup_002:
    А если серьезно, я сам еле разобрался. Этот код мне делал программист, который не учел одного момента. Поскольку уже на форуме выкладывали частичное решение проблемы, с которой я столкнулся, я его повторю (правда он немного переработан под мои задачи):
    void UdaleniePervuh(int magicnum)
    {
    int ors[];
    int i;
    for (i=0; i<OrdersTotal(); i++)
    {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if (OrderMagicNumber() == magicnum && OrderLots()==STlot)
    {
    ArrayResize(ors, ArrayRange(ors, 0) + 1);
    ors[ArrayRange(ors, 0) - 1] = OrderTicket();
    }
    }

    for (i = 0; i < ArrayRange(ors, 0); i++)
    {
    OrderSelect(ors[i], SELECT_BY_TICKET, MODE_TRADES);
    switch (OrderType())
    {
    case OP_BUY : OrderClose(ors[i], OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); break;
    case OP_SELL : OrderClose(ors[i], OrderLots(), MarketInfo(Symbol(), MODE_ASK), 0); break;
    default : OrderDelete(ors[i]);
    }
    }

    ArrayResize(ors, 0);
    }

    Вкратце - это удаление всех ордеров, которые имеют размер лота STlot.
    В чем суть вопроса: необходимо доработать этот код, чтобы происходило удаление одного ордера (а не всех) при условии, что
    1) этот ордер закроется с профитом или
    2) если таковых ордеров нет, то самый последний открытый ордер (размером лота STlot).
    Мне предложили такой код:
    void UdaleniePoslednih (int magicnum)
    {
    int total=OrdersTotal();
    for(int pos=total;pos>=0;pos--)
    {
    if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) == true) //
    {
    if(OrderMagicNumber()==magicnum && OrderProfit()>=0 && OrderLots()==STlot)
    {
    switch (OrderType())
    {
    case OP_BUY : OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); break;
    case OP_SELL : OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_ASK), 0); break;
    default : break;
    }
    }
    }
    }
    }
    Не уверен, будет ли он работать, как описал в задании. Т.е. удалять либо профитный, либо последний открытый с размером лотом STlot.
  4. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Код:
    void UdaleniePoslednih (int magicnum)
    {
    int total=OrdersTotal();
    for(int pos=total;pos>=0;pos--)
       {
        if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) == true) //
         {
          if(OrderMagicNumber()==magicnum && OrderProfit()>=0)
           {
               switch (OrderType())
                {
                  case OP_BUY : OrderClose(OrderTicket(), STlot, MarketInfo(Symbol(), MODE_BID), 0); break;
                  case OP_SELL : OrderClose(OrderTicket(), STlot, MarketInfo(Symbol(), MODE_ASK), 0); break;
                }
           }
         }
       }
    }
    Этот код удаляет все профитные ордера, а мне нужно, чтобы он удалил один ордер и проверил условие:

    Код:
    if(LotsCount1<=MaxBlocks) "остановить удаление ордеров"
    if(LotsCount1>MaxBlocks) "повторить удаление одного ордера"
    Подскажите, пожалуйста, куда его поставить?

    С уважением,
    Александр
  5. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    В сообщении 565 всё уже разжёвано и код написан таким образом, что в цикле, перед тем как удалять/закрывать ордера сравнивается ряд условий, по которым удаление или закрытие не происходит.

    Код:
    #define MAGIC 20050610
    
    extern bool is_Magic = true;
    
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    
    		// Начало условий прерывания
    
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    
    		// Конец условий прерывания
    
    		switch(OrderType()) {
    			case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    			case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    			default: OrderDelete(OrderTicket());
    		}
    	}
    }
    В промежутке между "Началом условий прерывания" и "Концом условий прерывания" можешь добавлять кучу условий на своё усмотрение, по которым удаление/закрытие ордеров выполняться не будет.
    Оператор continue в конце каждой строчки начинающейся с if приводит к тому, что дальнейшее выполнение кода в цикле прерывается, а сам цикл делает рестарт с увеличением/уменьшением счетчика цикла.

    "Остановить удаление ордеров" можно по условию if (какоето-условие) break;
    Опреатор break вообще прервет выполнение цикла.

    Таким образом, если бы ты не менял структуру кода, всё было бы просто: - Вставляем твои условия и всё.
    Код:
    if (LotsCount1<=MaxBlocks) break;
    А вот это if (LotsCount1>MaxBlocks) "повторить удаление одного ордера" я не понял. Что значит повторить? Цикл итак будет повторяться пока его счетчик не исчерпает лимит или не будет прерван оператором break. Но можно увеличить на единицу LotsCount1, таким образом в следующий проход цикла - это условие уже будет не выполнено.
    Ну типа так if (LotsCount1<=MaxBlocks) LotsCount1++; else break;

    Но ты изменил структуру кода. Куча условий вложенных друг в друга, делают код слижком не удобным. Я даже не знаю куда вставить в твоём варрианте. Придется многа букав писать, возможно даже разбить одну функцию на две.

    А разве так не проще?
    Код:
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    
    		// Начало условий прерывания
    
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    		if (LotsCount1<=MaxBlocks) LotsCount1++; else break;
    
    		// Конец условий прерывания
    
    		switch(OrderType()) {
    			case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    			case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    			default: OrderDelete(OrderTicket());
    		}
    	}
    }
  6. 107
    Комментарии
    0
    Темы
    107
    Репутация Pro
    Аватар для religare777  
    В начале пути

    2 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    А разве так не проще?
    Код:
    int init() {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    
    		// Начало условий прерывания
    
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if (is_Magic == true && OrderMagicNumber() != MAGIC) continue;
    		if (OrderStopLoss() > 0 && OrderTakeProfit() > 0) continue;
    		if (LotsCount1<=MaxBlocks) LotsCount1++; else break;
    
    		// Конец условий прерывания
    
    		switch(OrderType()) {
    			case OP_BUY: OrderClose(OrderTicket(), OrderLots(), Bid, 3); break;
    			case OP_SELL: OrderClose(OrderTicket(), OrderLots(), Ask, 3); break;
    			default: OrderDelete(OrderTicket());
    		}
    	}
    }

    Вот так заработало:
    Код:
    void UdaleniePoslednih ()
    {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    
    		// Начало условий прерывания
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if ((is_Magic == true && OrderMagicNumber()!=MAGICMA) || OrderLots()!=STlot) continue;
    		if (LotsCount1<=MaxBlocks) continue;
    		// Конец условий прерывания
          if (LotsCount1>MaxBlocks)
            { 
             switch(OrderType())
    			    {  
    			      case OP_BUY: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); LotsCount1--; break;
    			      case OP_SELL: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_ASK), 0); LotsCount1--; break;
    			      default: OrderDelete(OrderTicket());
    	          }
    	    }
    	}
    }
    Спасибо громадное!!! Удаляет именно то количество лишних ордеров, которое нужно!
  7. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    Да незачто спасибо!
    Вот только опять в вашем коде присутствует логика нелепости.

    После условия if (LotsCount1<=MaxBlocks) continue; проверять условие if (LotsCount1>MaxBlocks) как минимум глупо.
    Словами это будет так: Если меньше или равно, значит пропустить цикл (continue), а в противном случае что?
    Что если не меньше и не равно? Напрашивается вывод что если условие if (LotsCount1<=MaxBlocks) continue; не выполнено, то и козе понятно что LotsCount1>MaxBlocks и делать эту проверку нет смысла, зря только расходуем ресурсы процессора!!!:D

    То есть, проще выражаясь: - Уберите из вашего кода if (LotsCount1>MaxBlocks) и увидите, что ничего не изменится!:)
  8. 1,321
    Комментарии
    7
    Темы
    1547
    Репутация Pro
    Аватар для Владимир Гербатов  
    Мастер форумных наук

    5 Медалей
    А вот ещё: - Функцию ты назвал прикольно UdaleniePoslednih()...:D

    Может быть RemoveLastOrders() симпотичнее будет?:)

    PS Еси уж на то пошло, то функцию вообще можно назвать кирилицей

    Код:
    int start() {
       УдалениеПоследних();
    }
    
    void УдалениеПоследних() {
       .......................................
       .......................................
       .......................................
       return(0);
    }
    :D:D:D
  9. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от Vladiger Посмотреть сообщение
    А вот ещё: - Функцию ты назвал прикольно UdaleniePoslednih()...:D

    Может быть RemoveLastOrders() симпотичнее будет?:)

    PS Еси уж на то пошло, то функцию вообще можно назвать кирилицей

    Код:
    void УдалениеПоследних() {
       return(0);
    }
    :D:D:D
    эта..... хорош...... ежели, при таком стиле, ещё и функции будут по русски обзываться- ему вообще хрен кто помогать будет.... я точно- даже читать дальше не буду:D

    а вообще.... для простоты я бы их разделил..... на del_sell(int magic) и del_buy(int magic)..... а чтобы корректно всё удалялось и в циклах while не долбило сервер- еще и пару функций на проверку... а удалилось ли оно
  10. 3,168
    Комментарии
    1
    Темы
    3184
    Репутация Pro
    Аватар для SergP  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от religare777 Посмотреть сообщение
    Вот так заработало:
    Код:
    void UdaleniePoslednih ()
    {
    	for(int i = OrdersTotal(); i >= 0; i--) {
    
    		// Начало условий прерывания
    		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false || OrderSymbol() != Symbol()) continue;
    		if ((is_Magic == true && OrderMagicNumber()!=MAGICMA) || OrderLots()!=STlot) continue;
    		if (LotsCount1<=MaxBlocks) continue;
    		// Конец условий прерывания
          if (LotsCount1>MaxBlocks)
            { 
             switch(OrderType())
    			    {  
    			      case OP_BUY: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_BID), 0); LotsCount1--; break;
    			      case OP_SELL: OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(), MODE_ASK), 0); LotsCount1--; break;
    			      default: OrderDelete(OrderTicket());
    	          }
    	    }
    	}
    }
    Спасибо громадное!!! Удаляет именно то количество лишних ордеров, которое нужно!
    не удаляет:D

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

Вверх
РегистрацияX

чтобы писать, читать, комментировать