Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 32

 
Vitalie Postolache:

Aí está, isso é diferente, agora está claro o que é o 1% em relação a ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
Você não consegue entender a linguagem. Você precisa de 10 linhas para escrever duas palavras, depois só precisa de duas para escrever 10 palavras... Você pensaria que a programação estaria bem e, no final, seria uma bagunça).
 
spoiltboy:
O Expert Advisor considera os valores mínimos e máximos dos últimos X bares e faz pedidos por eles. Então, quando o máximo ou mínimo é diminuído, você deve apagar o pedido correspondente e abrir com novos dados.


Não entendeu exatamente quando você modificou as pausas, mas fez com que, se o preço mínimo for mais alto do que o preço de ajuste do BuyLimit existente, então você precisa modificá-lo para o novo preço mínimo.

Para SellLimit - espelhado.

Eu apenas escrevi o código, mas não o verifiquei de forma alguma - deixo para vocês modificarem e verificarem a correção do algoritmo e do código em geral.

//--- 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();   }
         }
      }
}
//+------------------------------------------------------------------+

Espero que você descubra

 
Artyom Trishkin:

Por que excluir quando você pode modificar o preço de ajuste e parar e retirar em relação ao novo nível?

Comecei agora mesmo a estudar e a opção de exclusão era estudar a aplicação da função, eu me perguntava por que não funcionava.

Obrigado a todos por seu feedback.

 

Alguém quer saber como deve ser o comando de reset externo?

como deve ser

1) Selecione da lista um conjunto de condições necessárias para o comando acionar, por exemplo, abrir uma ordem

2) A ordem é aberta e o comando não funciona sob nenhuma outra condição. A filtragem por bilhete e quantidade do pedido não é uma opção, uma vez que o princípio em si deve ser espalhado por toda a lista.

 
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Qual é o erro aqui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usar cruzamento móvel + filtro na distância após cruzamento móvel. Quão precisa é esta condição?
 
Movlat Baghiyev:
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Qual é o erro aqui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usar cruzamento móvel + filtro por distância após cruzamento móvel. Quão precisa é esta condição?

O queGrossMA1 eGrossMA2 lhe devolvem, provavelmente há uma diferença lá, você acaba com algo como isto

MA1= 1.0050

se (MA1 > 0,0052) // não é o preço em si, mas sua diferença, então não é uma comparação incorreta

 
Vitaly Muzichenko:

O queGrossMA1 eGrossMA2 lhe devolvem, provavelmente há uma diferença lá, você acaba com algo como isto

MA1= 1.0050

se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta

Você pode me dizer como fazer isso corretamente?
 
Vitaly Muzichenko:

O queGrossMA1 eGrossMA2 lhe devolvem, muito provavelmente há uma diferença, você acaba com algo como isto

MA1= 1.0050

se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta

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:

O queGrossMA1 eGrossMA2 lhe devolvem, muito provavelmente há uma diferença, você acaba com algo como isto

MA1= 1.0050

se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta

O cruzamento é verdadeiro. A questão está mais relacionada a esta condiçãoBid>MA1+Distanse*Point()
 

Bom. Você pode me dizer onde está o erro?

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");
  } 

Tudo funciona, coloca um pedido ao preço de maxpr1.

Então eu quero fazer o mesmo, mas a um preço 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");
  }

Erro 130 (paradas erradas). O que eu estou fazendo de errado?

Razão: