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

 
Valeriy Yastremskiy:

differenza di modulo. Senza modulo, solo la zona superiore rientra nella condizione. OpenPrice - Bid |> 10*_Point condizione di apertura

Questo è il modo in cui la condizione dovrebbe essere, Bid è inferiore a OpenPrice e nessun modulo.

Altrimenti otterremo il risultato corretto se l'offerta è superiore all'OpenPrice

 
Valeriy Yastremskiy:

differenza di modulo. Senza il modulo, solo la zona superiore rientra nella condizione. OpenPrice - Bid |> 10*_Point condizione di apertura

Non capisco bene...

Puoi per favore renderlo più chiaro... per un principiante)

 
MakarFX:

Mi sorprendi.


Con cosa?
 
Alexey Viktorov:
Come?
Alexey Viktorov:

Dall'immagine si può vedere che OpenPrice - Bid non dovrebbe essere più di 10*_Point

ma può essere inferiore, compreso il negativo

 
MakarFX:

ma può essere inferiore, compreso il negativo

Sì... e si ottiene la condizione con "&& > 0"

Qual è la domanda? Così, o per qualcosa?

 
Alexey Viktorov:

Sì... e si ottiene la condizione con "&& > 0"

Qual è la domanda? Così, o per qualcosa?

Attualmente sto usando questa definizione del momento per entrare nel mercato

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point)

Ho pensato che ci potrebbe essere un modo per semplificarlo)

 

Aiuta a ottimizzare un pezzo di codice per martin

Il compito è questo:

-dopo la fermata, un Martin moltiplicherà il lotto;

-Il numero di moltiplicazioni può essere regolato con la funzione OrdersClose, e quando raggiunge un valore specificato, il lotto viene riportato a quello di partenza;

- il volume del lotto non deve essere riportato al volume di partenza, ma deve essere diminuito sequenzialmente in ordine inverso;

per esempio OrdersClose=5, Martin=2, lot=0.01:

abbiamo la sequenza: 0,01; 0,02; 0,04; 0,08; 0,16 (reset) 0,01; 0,01;,,,,

necessità: 0.01; 0.02; 0.04; 0.08; 0.16 (reset) 0.16; 0.08; 0.04; .... 0,01.

Non ho abbastanza conoscenze per risolvere il problema da solo.

Ho provato a inserire diverse combinazioni, ma non ho ottenuto l'effetto desiderato.

double LOT()
{
   int n=0;
   double OL=dLots;
   for (int j = OrdersHistoryTotal()-1; j >= 0; j--)
   {
      if (OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == iMagic)
         {
            if (OrderProfit()<0) 
            {
               if (n==0) OL=NormalizeDouble(OrderLots()*K_Martin,DigitsLot);
               n++;
               if (n>=OrdersClose) {Comment("1");return(dLots);}
            }
            else
            {
               if (n==0) {Comment("2");return(dLots);}
               else {Comment("3");return(OL);}
            }
         }
      }
   }
   return(OL);
}
 
MakarFX:

Attualmente sto usando questa definizione di punto di entrata nel mercato

Ho pensato che ci potrebbe essere un modo per semplificarlo)

if(Bid < OpenPrice && Bid > OpenPrice-Х*Point)
if(Ask > OpenPrice && Ask < OpenPrice+Х*Point) // цену в середину диапазона ставим

OpenPriceS=OpenPrice-X*Point/2;
if(fabs(Bid-OpenPriceS)>Х*Point){ ....   }

E Alexey ha ragione))

Alexey Viktorov:

Questo è come dovrebbe essere per condizione, offerta sotto OpenPrice e nessun modulo.

Altrimenti otteniamo il risultato corretto se Bid è superiore a OpenPrice

Fisso)

Sì, esatto. Non ha cambiato la condizione. Per abitudine. Si confonde su un'immagine che Bid è nel mezzo))))

Ma lì seconda condizione, l'ingresso è lo stesso in numero di condizioni.

 
законопослушный гражданин:

Aiuta a ottimizzare un pezzo di codice per martin

Il compito è questo:

-dopo la fermata, un Martin moltiplicherà il lotto;

-Il numero di moltiplicazioni può essere regolato con la funzione OrdersClose, e quando raggiunge un valore specificato, il lotto viene riportato a quello di partenza;

- il volume del lotto non deve essere riportato al volume di partenza, ma deve essere diminuito sequenzialmente in ordine inverso;

per esempio OrdersClose=5, Martin=2, lot=0.01:

abbiamo la sequenza: 0,01; 0,02; 0,04; 0,08; 0,16 (reset) 0,01; 0,01;,,,,

necessità: 0.01; 0.02; 0.04; 0.08; 0.16 (reset) 0.16; 0.08; 0.04; .... 0,01.

Non ho abbastanza conoscenze per risolvere il problema da solo.

Ho provato diverse combinazioni, ma non ho ottenuto l'effetto desiderato.

//+------------------------------------------------------------------+
//| Расчет лота                                                      |
//+------------------------------------------------------------------+
double Lots()
  {
   double L=0;
   // если последняя закрытая сделка убыточная и лот равен стартовому
   // включаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)==Lot) 
     {
      Martin=true;
     }
   // если последняя закрытая сделка убыточная и лот больше или равен максимальному
   // выключаем Мартин
   if(GetInfoLastPos(2)<0&&GetInfoLastPos(1)>=MaxMartinLot)
     {
      Martin=false;
     }
   // если последняя закрытая сделка убыточная и Мартин включен, умножаем лот
   if(Martin==true)
     {
      L=NormalizeDouble(GetInfoLastPos(1)*K_Martin,DigitsLot);
     }
   // если последняя закрытая сделка убыточная и Мартин выключен, делим лот
   if(Martin==false)
     {
      L=NormalizeDouble(GetInfoLastPos(1)/K_Martin,DigitsLot);
     }

   if(L>MAXLOT) L = MAXLOT;
   if(L<MINLOT) L = MINLOT;
   return(L);
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos(int a=1)
  {
   datetime t=0;
   double result=0,l=0,p=0,f=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if(a==1) {result=l;} else
   if(a==2) {result=p;} else
   if(a==3) {result=(double)t;}
   else     {result=0;}
   return(result);
  }
 
Valeriy Yastremskiy:

E Alexei ha ragione))

Sì, proprio così. Non ha cambiato la condizione. Per abitudine. Nella foto si confonde il fatto che Bid sia al centro)))

Grazie, ma non semplifica in alcun modo il mio codice)