советник - разные вопросы - страница 23

 

Рекомендую.

Когда вы решите все эти проблемы, вы сможете считать себя одним из профессионалов.

Делайте вещи как можно сложнее, тогда вы научитесь большему.

В противном случае вы будете постоянно бороться с простыми вещами.

 

Прежде всего, большое спасибо за ваши комментарии.

После ваших комментариев я решил, что должен еще раз создать блоки кода Order Modification для уверенности и для тестирования.

 

Г-н @Marco vd Heijden

После ваших замечаний/примеров я уже написал код для перетаскивания цены тейк-профита.
Но вообще-то я против постоянных обновлений. Почему? С тех пор, как я написал блоки кода для перетаскивания тейк-профита, я вижу, что мой график медленно обновляется. Возможно, я допустил ошибки в этой части кода. Я проверю это после того, как решу этот вопрос.

(пока я пытался решить свой вопрос самостоятельно, после нескольких попыток, я подумал, что нет возможности остановить вычисления, если я использую оператор цикла " for " )

Я хотел бы отметить, что у меня уже есть расчеты для размеров тейк-профита и стоп-лосса, поэтому я удалил оператор "Switch" из кода ниже.
Я просто пробую, когда цена тейк-профита будет равна цене линии - тогда стоп рассчитывается / обновляется до следующего раза, когда цена тейк-профита "!= цене линии".
В: Мне
трудно исправить приведенный ниже код. Что я могу сделать для этого, пожалуйста?
В: Я делаю неправильно, что не использую оператор "Switch" для решения этой проблемы?

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               /* I just try for - if price not equal != "Line OBJPROP_PRICE "
                  stop updates */


               // if objects not found - create them
               // ...
               // if objects exist
               // ...
               while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
                 {
                  PlaySound("ok.wav");
                  price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
                  Comment(price);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Пока я читал документацию и книгу по OrderModify() с примером, я не увидел примера именно для моей проблемы.

Всего вам наилучшего!

 

Я не следил за этой темой, поэтому мог пропустить то, что вы делаете.

Прежде всего, упрощайте:

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
Должно стать:
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

Также подумайте о том, как часто вы двигаете линию. Раз в секунду? Скорее всего, нет.

Поместите свой код в OnChartEvent():

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line

Вы вызываете одну и ту же функцию несколько раз на каждом открытом ордере:

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
   Comment(price);
  }

Вызовите ее один раз перед тем, как войти в цикл ордеров:

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal()-1; order>=0; order--)
  {  
 

Убедитесь, что вы понимаете принцип работы циклов while.

Это опасно, потому что если по какой-то причине другой советник попытается изменить значение цены линии, то в результате этот кусок кода застрянет в бесконечном цикле, и ваш терминал, скорее всего, зависает.

Обычно это заканчивается аномальным завершением работы.

Поскольку вы используете объект "line", опасность не так велика, как в случае с уровнями tp и sl, которые посылаются на сервер функцией OrderModify(), поэтому, если вы не планируете написать другой советник, который будет вмешиваться в "line", это не должно быть проблемой.

 
honest_knave:

Я не следил за этой темой, поэтому мог пропустить то, что вы делаете.


Назовите его один раз, прежде чем войти в цикл приказа:

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal(); order>=0; order--)
  {  

Пожалуйста, поймите, что он пытается сделать.

Он должен позвонить два раза и сравнить значения, чтобы узнать, была ли линия перемещена.

Это невозможно сделать, не прочитав значение дважды.

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))// if price differs from "line" value do:
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);// now overwrite old line value with new line value.
   Comment(price);
  }
 
Marco vd Heijden:

Пожалуйста, поймите, что он пытается сделать.

Он должен вызвать два раза и сравнить значения, чтобы узнать, была ли линия перемещена.

Это невозможно сделать без двойного считывания значения.

Вам придется объяснить мне это еще раз.

Если у вас есть CHARTEVENT_OBJECT_DRAG и sparam - "line", значит, линия переместилась.

В редких случаях, когда она перемещается по времени вдоль одной и той же цены, штраф невелик.

 

Существует множество способов сделать одно и то же.

Если вы решите использовать CHARTEVENT, помните, что он не работает в тестере.

 
Хорошо, я оставляю это вам, ребята. Удачи.
 

Я уже прочитал ваши полезные комментарии, мистер Марко, мистер Кнаве, мистер Уильям, спасибо большое за все эти комментарии!

Сейчас я уже проверил несколько вещей и также решил, что могу написать ( / и проверить) OrderModify() шаг за шагом. Потому что этот OrderModify() действительно очень опасен для меня.
Несколько раз я уже сталкивался с неправильными модификациями. Но когда я пытаюсь решить те же проблемы/вопросы, что я точно знаю, откуда берутся эти проблемы, даже я пробую те же вещи в диаграмме, что проблемы/вопросы не повторялись. Через несколько часов я снова столкнулся с той же проблемой.
Я все еще не знаю, что именно вызвало эту проблему. Что такое проблема, о которой я говорю. Я уже поделился с вами одной из них в своем предыдущем комментарии. Также я открыл одну позицию с помощью моего советника Trade Panel, все в порядке! Затем я попытался открыть Sell Limit методом ручной торговли. (в моей торговой панели еще нет отложенных ордеров Sell Limit или Sell Stop).

Итак, я думаю, что должен поделиться с вами кодами этого блока, но пока я не могу поделиться ими, потому что я все еще работаю над ним. Я хочу переместить коды этого блока в OnChartEvent() - потому что также я добавлю в него несколько кнопок.

Проблема: Я не могу написать код, если ордер закрыт, то удалите его объекты, как это, Stop Loss, Take Profit, Open, Close стрелки что-то вроде этого, пожалуйста, помогите мне.
Вопрос: Также Stop Loss, Take Profit Lines перед объектами торговой панели. Я знаю, что это вызвано последним созданием объекта. Но если вы понимаете меня, пожалуйста, дайте мне знать, как я могу сделать, чтобы объект торговой панели был перед всеми другими объектами без линий "Stop Loss и Take Profit".

Заранее спасибо.