Вопрос по функции OrderSelect

 

boopa26 может написать код отправки ордеров, но не может написать функцию выбора ордеров для закрытия ордеров. хочет написать функцию выбора ордеров для закрытия ордеров без циклов for или while. boopa26 хочет написать функцию выбора ордеров для закрытия ордеров с условиями if, но boopa26 не понимает, как собрать функцию выбора ордеров для закрытия ордеров.


пример отправки ордера на покупку

if(OrdersTotal()==0)OrderSend(Symbol(),OP_BUY,.1,Ask,3,0,0,NULL,9,0,clrNONE);


пример order select. boopa26 не понимает

OrderSelect(int index,int select,int pool)


что такое int index?

что такое int select?

что такое int pool?

что делает order select?

 

Вы читали документацию?

Parameters

ticket

[in] Индекс заказа или билет заказа в зависимости от второго параметра.

select

[in] Флаги выбора. Это может быть любое из следующих значений:

SELECT_BY_POS - индекс в пуле заказов,
SELECT_BY_TICKET - индекс является билетом заказа.

pool=MODE_TRADES

[in] Дополнительный индекс пула заказов. Используется, когда выбранный параметр - SELECT_BY_POS. Это может быть любое из следующих значений:

MODE_TRADES (по умолчанию) - ордер выбирается из торгового пула (открытые и отложенные ордера),
MODE_HISTORY - ордер выбирается из пула истории (закрытые и отмененные ордера).


 
читать документацию сейчас https://docs.mql4.com/trading/orderselect
 
гумрай мог бы включить ссылку на документацию. просто шучу. спасибо гумрай
 
bool  OrderSelect(
   int     index,            // index or order ticket
   int     select,           // flag
   int     pool=MODE_TRADES  // mode
   );

boopa26 хочет закрыть открытые ордера, поэтому boopa выбирает MODE_TRADES в качестве третьего параметра


делает ли boopa26 SELECT_BY_POS или SELECT_BY_TICKET? boopa26 не знает.

SELECT_BY_POS //index inside order pool,
SELECT_BY_TICKET //index is order ticket.
 

boopa26 выбирает MODE_TRADES в качестве третьего параметра

boopa26 выбирает SELECT_BY_POSITION в качестве второго параметра

boopa26 выбирает индекс заказа в качестве первого параметра


пример

static int order_index;

if(OrderSelect(order_index,SELECT_BY_POSITION,MODE_TRADES)==1
 

https://docs.mql4.com/trading/orderclose

как boopa26 циклически, без циклов for или while, но с условиями if закрыть открытые ордера с помощью функции выбора ордера?

документация закрытие ордера требует, чтобы был найден билет ордера, но boopa26 делает выбор ордера, чтобы найти позицию ордера, а не билет

bool  OrderClose(
   int        ticket,      // ticket
   double     lots,        // volume
   double     price,       // close price
   int        slippage,    // slippage
   color      arrow_color  // color
   );

1. выбрать ордер

2. закрыть ордер

не знает как

 
//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

#define  MAGICMA  20131111
//--- Inputs
input double Lots          =0.1;
input double MaximumRisk   =0.02;
input double DecreaseFactor=3;
input int    MovingPeriod  =12;
input int    MovingShift   =6;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//--- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//--- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Error in history!");
            break;
           }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
            continue;
         //---
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions
   if(Open[1]>ma && Close[1]<ma)
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma)
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+
советник поскользящей средней использует цикл для закрытия открытых ордеров
 

Я думаю, что "boopa26" должен сделать следующее:

  1. Во-первых, "boopa26" должен сначала изучить основы кодирования (например, на C).
  2. Затем "boopa26" должен прочитать и следовать книге/учебнику (даже если он старый и неактуальный).
  3. В то же время, "boopa26" должен прочитать всю документацию с особым вниманием к обновлениям MQL4, которые не упоминаются в книге/руководстве.
  4. Затем "boopa26" должен изучить несколько примеров кода индикаторов, советников и скриптов в базе кодов пользователя.
  5. Затем "boopa26" может начать создавать свои собственные, но очень простые индикаторы и постепенно наращивать их, пока не сможет полностью понять и сделать более сложные индикаторы.
  6. Затем "boopa26" может начать создавать свои собственные, но очень простые советники и медленно наращивать их до полного понимания и создания более сложных советников.

"boopa26" также должен усвоить очень важный урок: "boopa26" не должен пропускать все необходимые шаги, потому что иначе "boopa26" просто потратит время всех впустую, и вместо "прекрасного торта" у "boopa26" будет только "сгоревший уголь".

 
FMIC:

Я думаю, что "boopa26" должен сделать следующее:

  1. Во-первых, "boopa26" должен сначала изучить основы кодирования (например, на C).
  2. Затем "boopa26" должен прочитать и следовать книге/учебнику (даже если он старый и неактуальный).
  3. В то же время, "boopa26" должен прочитать всю документацию с особым вниманием к обновлениям MQL4, которые не упоминаются в книге/руководстве.
  4. Затем "boopa26" должен изучить несколько примеров кода индикаторов, советников и скриптов в базе кодов пользователя.
  5. Затем "boopa26" может начать создавать свои собственные, но очень простые индикаторы и постепенно наращивать их, пока не сможет понять и сделать более сложные индикаторы.
  6. Затем "boopa26" может начать создавать свои собственные, но очень простые советники и медленно наращивать их до полного понимания и создания более сложных советников.

"boopa26" также должен усвоить очень важный урок, что "boopa26" не должен пропускать все необходимые шаги, потому что иначе "boopa26" просто потратит время всех впустую, и вместо "красивого торта" у него будет только "сгоревший уголь".

1. не требуется знание c. mql4 это разные функции

2. книга уже прочитана

3. уже прочитал документацию

4. код уже написан

5. ?

6. ?

boopa26 не тратит время людей

Учитель FMIC, который учит "boopa26" печь пироги с углем.

Класс угольного торта FMIC