Требуется помощь - страница 8

 
qgmql:

Является ли этот код нормальным? Если нет, то, пожалуйста, напишите код вместо ссылки, я все еще в замешательстве.


НЕТ https://www.mql5.com/en/forum/133792/page3#550831

выдает значение пункта для лота, торгуемого на определенном символе

 

1. Открыто несколько ордеров на покупку и один отложенный ордер на покупку. все ордера в одной валютной паре. как советник выберет только последний открытый ордер для проверки его стоп-лимитов?

2. каждый открытый ордер был размещен по разным ценам с tp 20. возможно ли, чтобы советник изменил все открытые ордера, кроме последнего, и изменил их стоп-лимиты на стоп-лимиты последнего открытого ордера?

ПРИМЕР:

Sr    type   price     tp
1     buy    1.23950   1.23750
------------------------------
#  buylimit   1.23750   1.23550

//////////////////////////////

1    buy     1.23950   1.23550 // tp modified and now equal to 2nd tp
2    buy     1.23750   1.23550 // 2nd tp
------------------------------
#  buylimit   1.23550   1.23350

//////////////////////////////

1    buy     1.23950   1.23350 // tp modified and now equal to 3rd tp
2    buy     1.23750   1.23350 // tp modified and now equal to 3rd tp
3    buy     1.23550   1.23350 // 3rd tp
------------------------------
#  buylimit   1.23350   1.23150
 

Некоторая путаница с...

//Signal Filter
#define  XXX   0
#define  AAA   1
#define  BBB   2

int SignalS = XXX;

if(SignalS & AAA !=0)
OrderSend(NULL, OP_BUY, LotSize, Ask, Slippage, SL, TP, WindowExpertName(), MagicID, 0, Blue);

Старый редактор принимает выделенные строки, но новый редактор выдает предупреждение "Expression not boolean".

Я попробовал...

if(SignalS && AAA !=0)
//or
if(SignalS !=0 & AAA !=0)

Теперь новый редактор принимает оба, но... какой из них будет работать так же, как выделенная строка? Если оба верны, то какой из них мне использовать? (удобнее?)

PS: Нижеприведенный код также принимается новым редактором...

if((SignalS & AAA) !=0)

Новый редактор принимает все три, но... какой из них будет работать так же, как выделенная строка? Если все верно, то какой из них будет более удобен для меня?

 
qgmql: Новый редактор принимает все три варианта, но... какой из них будет работать так же, как выделенная строка? Если все верно, то какой из них будет более удобен для меня?
  1. Не используйте битовую маску
    //Signal Filter
    #define  XXX   0
    #define  AAA   1
    #define  BBB   2
    
    int SignalS = XXX;
    
    if(SignalS & AAA !=0)
    enum eSignals = {XXX, AAA, BBB};
    
    eSignals SignalS = XXX;
    
    if(SignalS == AAA)
    
    Самодокументирующийся код.

  2. Использовать битовую маску:
    В сборке 600+ != имеет более высокий приоритет, чем побитовое И, вы ДОЛЖНЫ использовать
    (SignalS & AAA) !=0
    В предыдущих сборках побитовая операция и была выше, чем умножение

    Операция

    Описание

    Порядок выполнения

    ()

    []

    .

    Вызов функции

    Ссылка на элемент массива

    Ссылка на элемент структуры

    Слева направо

    !

    ~

    ++

    --

    (тип)

    sizeof

    Логическое отрицание

    Побитовое отрицание (дополнение)

    Изменение знака

    Увеличение на единицу

    Уменьшение на единицу

    Типизация

    Определение размера в байтах

    Справа налево

    *

    /

    %

    Умножение

    Деление

    Деление по модулю

    Слева направо

    +

    Сложение

    Вычитание

    Слева направо

    <<

    >>

    Сдвиг влево

    Сдвиг вправо

    Слева направо

    <

    <=

    >

    >=

    Меньше, чем

    Меньше или равно

    Больше чем

    Больше или равно

    Слева направо

    ==

    !=

    Равно

    Не равны

    Слева направо

    &

    Побитовая операция И

    Слева направо

    ^

    Побитовое исключающее ИЛИ

    Слева направо

    |

    Операция побитового ИЛИ

    Слева направо

    &&

    Логическая операция И

    Слева направо

    ||

    Логическая операция ИЛИ

    Слева направо

    ?:

    Условный оператор

    Справа налево

    =

    *=

    /=

    %=

    +=

    -=

    <<=

    >>=

    &=

    ^=

    |=

    Присваивание

    Умножение с присваиванием

    Деление с присвоением

    Модуль с заданием

    Сложение с заданием

    Вычитание с присвоением

    Левый сдвиг с заданием

    Правый сдвиг с присвоением

    Побитовое И с присвоением

    Исключающее ИЛИ с присвоением

    Побитовое ИЛИ с присвоением

    Справа налево

    ,

    Запятая

    Слева направо

    () Вызов функции Слева направо [] Ссылка на элемент массива
    !      Логическое отрицание Справа налево - Операция изменения знака ++ Увеличение -- Уменьшение ~ Побитовое отрицание (дополнение)
    & Побитовая операция И Слева направо | Побитовая операция ИЛИ ^ Побитовая операция исключающее ИЛИ << Сдвиг влево >> Сдвиг вправо
    * Умножение Слева направо / Деление % Деление по модулю
    + Сложение Слева направо - Вычитание
    < Меньше чем Слева направо <= Меньше чем или равно > Больше чем >= Больше чем или равно == Равно!= Не равно
    || Логическое ИЛИ Слева направо
    && Логическое И Слева направо
    = Присвоение Справа налево += Присвоение сложение -= Присвоение вычитание *= Присвоение умножение /= Присвоение деление %= Присвоение модуль >>= Присвоение сдвиг вправо <<= Присвоение сдвиг влево &= Присвоение побитовое И |= Присвоение побитовое ИЛИ ^= Присвоение исключающее ИЛИ
    Запятая Слева направо
 

WHRoeder Я нашел ваш код (выбор последнего рыночного ордера) и добавил выделенные строки для проверки его цены tp и для установки той же цены tp для предыдущих ордеров:

int PositionIndex;    //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
double Ord_TP=0;
TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable

for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --)  //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )      // <-- or is it a Sell Order ?
   if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
      //if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         //Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop

Дополнительная строка...

if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);

Пожалуйста, подскажите, если я не прав.

(Тип всех рыночных+отложенных ордеров - только buy, не sell или только sell, не buy, и я хочу, чтобы tp всех рыночных ордеров менялась каждый раз, когда открывается новый рыночный ордер ).

ЭТО ДЕЙСТВИТЕЛЬНО СЛОЖНО ДЛЯ МЕНЯ, НО Я ХОЧУ СДЕЛАТЬ ЭТО. :(

 
Ваш отступ неправильный, потому что вы не использовали скобки
if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); break;
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
Что на самом деле представляет собой ваш код
if(OrderTakeProfit()>0) 
   Ord_TP = OrderTakeProfit(); 
break;
/*NOTREACHED
   if(OrderTakeProfit() == Ord_TP) continue;
   if(OrderTakeProfit() != Ord_TP)
    OrderModify(OrderTicket(),0,0,Ord_TP,0,CLR_NONE);
*/
 
Все становится сложным для меня. Я думаю, я должен написать код с самого начала. и я буду вставлять каждую часть кода сюда. возможно, я смогу понять это лучше.