Помогите понять алгоритм. - страница 2

 
semiromid:

Как реализовать в этом советнике задумку, что бы ---->

Alert

срабатывал один раз, при открытии нового ордера ?

   //после открытия сделки один алерт ;)
   OrderSend(Symbol(), OP_BUY, LotsToBid,  NormalizeDouble(Ask,Digits), Slippage, SL, TP, NULL, STUPID, 0, Blue);
   Alert("OrderSend OP_BUY");
 
costy_:


costy_:


//после открытия сделки один алерт ;)
OrderSend(Symbol(), OP_BUY, LotsToBid, NormalizeDouble(Ask,Digits), Slippage, SL, TP, NULL, STUPID, 0, Blue);
Alert("OrderSend OP_BUY");

Ы . Что это значит чет не нашел нигде LotsToBid

м?

На месте LotsToBid должен стоять тип торговой операции

OP_BUY 0 Покупка
OP_SELL 1 Продажа
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT
OP_BUYSTOP 4 Отложенный ордер BUY STOP
OP_SELLSTOP 5 Отложенный ордер SELL STOP

 

LotsToBid --- это количество лотов на покупку

Вот вам код

//+------------------------------------------------------------------+
//|                                                        Graal.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
datetime lastBuy = 0;
datetime lastSell = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   while(!IsStopped())
     {
      RefreshRates();
      int total = OrdersTotal();
      datetime ddBuy = 0;
      datetime ddSell = 0;
      for(int i=0; i < total; i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
           int cmd=OrderType();
            //---- buy or sell orders are considered
           datetime dd = OrderOpenTime();
            if((cmd==OP_BUY)&&(dd>lastBuy))
              {
               ddBuy = dd;
               //////////////
               //////////////
               Alert("Открылся бай а надо селл :)");
               //////////////
               //////////////
               //////////////
              }
            if((cmd==OP_SELL)&&(dd>lastSell))
              {
               ddSell = dd;
               //////////////
               //////////////
               Alert("Открылся сел а надо было байть. эх...");
               //////////////
               //////////////
               //////////////
              }
           }
        }
      ///// Сделано именно так для случая если в одно и то же время будет два ордера Бай
      if (ddBuy!=0) lastBuy = ddBuy;
      if (ddSell!=0) lastSell = ddSell;
      Alert("Буду писать пока жив..");
      Sleep(1000);
     }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
semiromid:


//после открытия сделки один алерт ;)
OrderSend(Symbol(), OP_BUY, LotsToBid, NormalizeDouble(Ask,Digits), Slippage, SL, TP, NULL, STUPID, 0, Blue);
Alert("OrderSend OP_BUY");

Ы . Что это значит чет не нашел нигде LotsToBid

м?

На месте LotsToBid должен стоять тип торговой операции

OP_BUY 0 Покупка
OP_SELL 1 Продажа
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT
OP_BUYSTOP 4 Отложенный ордер BUY STOP
OP_SELLSTOP 5 Отложенный ордер SELL STOP

))

В своем "//Что-то делаем" советнике ищите OrderSend и после-перед функции-функцией открытия позиции ставьте алерт.

Т.е. когда советник открывает позицию выскочит алерт.

))

Зачем циклы листать ордера и прочее?!

 
costy_:

))

В своем "//Что-то делаем" советнике ищите OrderSend и после-перед функции-функцией открытия позиции ставьте алерт.

Т.е. когда советник открывает позицию выскочит алерт.

))

Зачем циклы листать ордера и прочее?!


//после открытия сделки один алерт ;)
OrderSend(Symbol(), OP_BUY, LotsToBid, NormalizeDouble(Ask,Digits), Slippage, SL, TP, NULL, STUPID, 0, Blue);
Alert("OrderSend OP_BUY");

Ы . Что это значит чет не нашел нигде LotsToBid

м?

На месте LotsToBid должен стоять тип торговой операции

Упс .. Туплю )

Просто мозги уже вскипели ХД

Зачем циклы листать ордера и прочее?!

Чтобы при открытии нового ордера, один раз сработал алерт . Независимо от тиков.

 
rlx:

LotsToBid --- это количество лотов на покупку

Вот вам код


//+------------------------------------------------------------------+
//| Graal.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
datetime lastBuy = 0;
datetime lastSell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
while(!IsStopped())
{
RefreshRates();
int total = OrdersTotal();
datetime ddBuy = 0;
datetime ddSell = 0;
for(int i=0; i < total; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
int cmd=OrderType();
//---- buy or sell orders are considered
datetime dd = OrderOpenTime();
if((cmd==OP_BUY)&&(dd>lastBuy))
{
ddBuy = dd;
//////////////
//////////////
Alert("Открылся бай а надо селл :)");
//////////////
//////////////
//////////////
}
if((cmd==OP_SELL)&&(dd>lastSell))
{
ddSell = dd;
//////////////
//////////////
Alert("Открылся сел а надо было байть. эх...");
//////////////
//////////////
//////////////
}
}
}
///// Сделано именно так для случая если в одно и то же время будет два ордера Бай
if (ddBuy!=0) lastBuy = ddBuy;
if (ddSell!=0) lastSell = ddSell;
Alert("Буду писать пока жив..");
Sleep(1000);
}

//----
return(0);
}
//+------------------------------------------------------------------+

У меня открыто 3-и ореда

1-й селл

2-й бай

3-й отложеный байстоп

И постоянно срабатывает эта часть кода

///// Сделано именно так для случая если в одно и то же время будет два ордера Бай
if (ddBuy!=0) lastBuy = ddBuy;
if (ddSell!=0) lastSell = ddSell;
Alert("Буду писать пока жив..");
Sleep(1000);

Мне не очень ясно,зачем она нужна?

 

Строку Alert("Буду писать пока жив.."); ---- Можете удалить

Главное в том что Alert("Открылся бай а надо селл :)"); и Alert("Открылся сел а надо было байть. эх..."); срабатывает лишь один раз для каждого ордера??

Ваша задача выполлена?

 

Главное не удаляйте

if (ddBuy!=0) lastBuy = ddBuy;
if (ddSell!=0) lastSell = ddSell;

Иначе ваши ордера будут обрабатываться по многу раз.

И

Sleep(1000);
Иначе компьютер просто зависнет.
 

Я бы вам рекомендовал ознакомиться с самым сердцем программирования - Логикой.

https://docs.mql4.com/ru/basis/operators

https://book.mql4.com/ru/basics/operators

Оператор если.

if......(uslovie)................{ operacii }

если (условие истина) то {делаем операции}

Цикл

while(uslovie)................. {operacii}

пока (условие истина) то {делаем операции}

И все больше для написания программы ничего и не нужно ;)

Все остальные специальные функции можно смотреть в справочнике.

 
rlx:

Строку Alert("Буду писать пока жив.."); ---- Можете удалить

Главное в том что Alert("Открылся бай а надо селл :)"); и Alert("Открылся сел а надо было байть. эх..."); срабатывает лишь один раз для каждого ордера??

Ваша задача выполлена?


тестирую ) Пока все работает хорошо )

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

В любом случаи благодарю вас что откликнулись на мой крик о помощи, показали свой вариант скрипта, и дали новые знания о языке mql4.

Причина обращения: