Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 32

 
Vitalie Postolache:

Ecco, questo è diverso, ora è chiaro a cosa si riferisce l'1% ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
Non si capisce la lingua: per due parole ci vogliono 10 righe, poi per 10 parole ne bastano solo due... Si potrebbe pensare che ci sia un ordine nella programmazione e poi un casino alla fine).
 
spoiltboy:
L'Expert Advisor considera i valori minimi e massimi delle ultime X barre e piazza gli ordini in base ad essi. Poi, quando il massimo o il minimo è diminuito, si dovrebbe cancellare l'ordine corrispondente e aprire con nuovi dati.


Non ha capito esattamente quando si modificano le pause, ma ha fatto in modo che se il prezzo minimo è superiore al prezzo di impostazione BuyLimit esistente, allora è necessario modificarlo al nuovo prezzo Min.

Per SellLimit - speculare.

Ho solo scritto il codice, ma non l'ho controllato affatto - lascio a voi il compito di modificare e controllare la correttezza dell'algoritmo e del codice in generale.

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataPendingOrder
  {
   int      number;     // Количество
   double   price_set;  // Цена установки
  };

struct DataPending
  {
   DataPendingOrder  buy_limit;  // BuyLimit
   DataPendingOrder  buy_stop;   // BuyStop
   DataPendingOrder  sell_limit; // SellLimit
   DataPendingOrder  sell_stop;  // SellStop
  };

struct DataOrders
  {
   int         buy;     // Количество позиций Buy
   int         sell;    // Количество позиций Sell
   DataPending order;   // Данные отложенного ордера
  };
DataOrders getData;   // Данные ордеров и позиций
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,getData);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0, minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- если нету рыночных Buy
   if(getData.buy==0) {
      //--- если нет отложенного BuyLimit
      if(getData.order.buy_limit.number==0) {
         double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
         double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
         ResetLastError();
         int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
         if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
         else Print("OP_BUYLIMIT OK");
         }
      //--- если есть BuyLimit
      else {
         //--- если цена Min больше цены установки BuyLimit
         if(minPrice>getData.order.buy_limit.price_set) {
            // модифицировать BuyLimit - поставить его на цену minPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }
  
   //--- если нету рыночных Sell
   if(getData.sell==0) {
      //--- если нет отложенного SellLimit
      if(getData.order.sell_limit.number==0) {
         double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
         double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
         ResetLastError();
         int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
         if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
         else Print("OP_SELLLIMIT OK");
         }
      //--- если есть SellLimit
      else {
         //--- если цена Max меньше цены установки SellLimit
         if(maxPrice<getData.order.sell_limit.price_set) {
            // модифицировать SellLimit - поставить его на цену maxPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }

   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
   ZeroMemory(data_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         //--- рыночные позиции
         if(OrderType()==OP_BUY)    data_of.buy++;
         if(OrderType()==OP_SELL)   data_of.sell++;
         //--- отложенные ордера
         if(OrderType()==OP_BUYLIMIT)  {  data_of.order.buy_limit.number++;   data_of.order.buy_limit.price_set=OrderOpenPrice();   }
         if(OrderType()==OP_BUYSTOP)   {  data_of.order.buy_stop.number++;    data_of.order.buy_stop.price_set=OrderOpenPrice();    }
         if(OrderType()==OP_SELLLIMIT) {  data_of.order.sell_limit.number++;  data_of.order.sell_limit.price_set=OrderOpenPrice();  }
         if(OrderType()==OP_SELLSTOP)  {  data_of.order.sell_stop.number++;   data_of.order.sell_stop.price_set=OrderOpenPrice();   }
         }
      }
}
//+------------------------------------------------------------------+

Spero che lo capirete

 
Artyom Trishkin:

Perché cancellare quando si può modificare il prezzo di impostazione e lo stop e il takeout relativi al nuovo livello?

Ho appena iniziato a studiare e l'opzione di cancellazione era per studiare l'applicazione della funzione, mi chiedevo perché non funzionasse.

Grazie a tutti per il vostro feedback.

 

Qualcuno vuole sapere come dovrebbe essere il comando extern reset?

come dovrebbe apparire

1) Selezionare una serie di condizioni richieste dalla lista per il comando da attivare, ad esempio, aprire un ordine

2) L'ordine è aperto e il comando non funziona in altre condizioni. Il filtraggio per biglietto e quantità d'ordine non è un'opzione poiché il principio stesso dovrebbe essere distribuito in tutta la lista.

 
se (MA1>GrossaMA1 && MA2<GrossaMA2 && Bid>MA1+Distanse*Point() ) Qual è l'errore qui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usano l'intersezione mobile + filtro sulla distanza dopo l'intersezione mobile. Quanto è accurata questa condizione?
 
Movlat Baghiyev:
se (MA1>GrossaMA1 && MA2<GrossaMA2 && Bid>MA1+Distanse*Point() ) Qual è l'errore qui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usano l'intersezione mobile + filtro per distanza dopo l'intersezione mobile. Quanto è accurata questa condizione?

Quello cheGrossMA1 eGrossMA2 vi restituiscono, molto probabilmente c'è una differenza, vi ritroverete con qualcosa del genere

MA1= 1,0050

if (MA1 > 0.0052) // non è il prezzo stesso ma la sua differenza, quindi non è un confronto errato

 
Vitaly Muzichenko:

Quello cheGrossMA1 eGrossMA2 ti restituiscono, probabilmente c'è una differenza, ti ritrovi con qualcosa come questo

MA1= 1,0050

if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato

Puoi dirmi come farlo correttamente?
 
Vitaly Muzichenko:

Quello cheGrossMA1 eGrossMA2 vi restituiscono, c'è molto probabilmente una differenza, vi ritroverete con qualcosa come questo

MA1= 1,0050

if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato

FRMA1=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 0);
    FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);

    FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
    FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);

    GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
    GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
 
Vitaly Muzichenko:

Quello cheGrossMA1 eGrossMA2 ti restituiscono, probabilmente c'è una differenza, ti ritrovi con qualcosa come questo

MA1= 1,0050

if (MA1 > 0.0052) // cioè non il prezzo stesso, ma la sua differenza, quindi è un confronto errato

L'intersezione è corretta. La domanda è più legata a questa condizioneBid>MA1+Distanse*Point()
 

Bene. Puoi dirmi dov'è l'errore?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Tutto funziona, fa un ordine al prezzo di maxpr1.

Poi voglio fare lo stesso, ma al prezzo minpr1:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Errore 130 (fermate sbagliate). Cosa sto facendo di sbagliato?