Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 191

 
yan720:

Grazie per la sua risposta. Io stesso ero sorpreso che fosse sorta una tale domanda. Anche se forse ho frainteso quello che ho visto e che ha causato la domanda.

Ora sto guardando il codice di altre persone per vedere quali metodi (diversi dal mio e forse più efficienti) sono usati per implementare certi algoritmi. In questo momento sto guardando il famigerato Ilan 1.6 Expert Advisor (allegato). Vedo che è stato assemblato da varie parti e poi ricostruito. Ma la linea 337 contiene una funzione di trailing stop definita dall'utente (anche se il flag del suo utilizzo è forzatamente cancellato all'inizio). Questa funzione è chiamata alla linea 52.

La mia domanda nasce dal fatto che il trailing stop di cui sopra modifica gli ordini aperti (e ce ne possono essere diversi) con uno stop loss mantenendo il loro TakeProfit iniziale ma impostando lo stesso valore (AveragePrice, che viene calcolato nelle righe 173 e 178) a questi ordini come prezzo aperto (secondo parametro della funzione OrderModify).

Oppure, quel parametro (prezzo aperto) è semplicemente ignorato dal server quando si modifica un ordine aperto e il server può impostare qualsiasi prezzo?

Quando si modifica una posizione sul mercato, il prezzo dovrebbe essere impostato e uguale al prezzo di apertura: OrderOpenPrise()

PS Se fossi in te, non cercherei "algoritmi efficienti" in questo codice - sembra che la persona abbia scritto del codice senza sapere veramente cosa ci stia facendo...

 
Vai a
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

trova che la "stupidità" sia misericordiosa, abbia pietà di un uomo torturato da Pascal.

 
artmedia70:
Quando si modifica una posizione di mercato, il prezzo deve essere impostato e uguale al prezzo di apertura della posizione: OrderOpenPrise()

Allora questa funzione, secondo voi, non funzionerà? Non l'ho testato ma mi sembra che faccia parte di un codice funzionante (questo Ilan è stato ovviamente ricostruito da qualcosa di debuggato al meglio). O è ancora un codice scadente?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
Ciao, è necessario scrivere un Expert Advisor sulla strategia 3 candele.Il commercio è condotto sui grafici Renko che sono cancellati dal rumore del mercato.Quando tre barre consecutive nella stessa direzione per aprire un ordine di acquisto o di vendita, stop loss messo in cima alla barra precedente, dopo la chiusura della candela prende un stop loss sulla barra prevedshego
 
artmedia70:

PS Se fossi in te, non cercherei "algoritmi efficienti" in quel codice - sembra che il tizio abbia scritto il codice senza sapere davvero cosa ci stia facendo...

Sì, il codice è molto specifico con un sacco di ridondanza e non solo. Ma non mi interessano tanto gli algoritmi in quanto tali, ma l'approccio all'implementazione dell'idea che c'è dietro. Sto guardando il quadro generale, o qualcosa del genere. Cosa viene messo nelle singole funzioni, come viene implementato lo stesso braccio di traino, rispetto al mio, ecc. Sono autodidatta ed è solo utile per me :)
 
artmedia70:
Nel posto giusto - che posto è?


Per esempio un ordine è già a 1200 punti... e il prezzo per esempio stava affondando e le stelle si sono già allineate in modo che in questo posto si deve piazzare un ordine... e l'ordine è già lì e non abbassare il saldo sotto quello richiesto per evitare di piazzare 2 ordini ciascuno, per esempio
 
yan720:

Allora pensate che questa funzione non funzionerà? Non l'ho testato, ma mi sembra che faccia parte di un codice funzionante (questo Ilan è stato ovviamente ricostruito da qualcosa di debuggato al meglio). O è ancora un codice scadente?

Beh... il codice non è reale. Come minimo.

 
L'essenza della domanda è la seguente. Voglio cambiare il semplice Expert Advisor MACD standard, ma sono uno zero totale nella programmazione.
Voglio cambiare l'EA per lavorare con una griglia, stop e un magik invece di un singolo ordine.
Ecco le variabili che volevo aggiungere:
Stoploss = è posto allo stesso livello per tutta la griglia, per esempio, è uguale a EUR/USD = 200pp ed è posto al livello di 1,3450 per tutti gli ordini nella griglia
MaxOnDer = Numero massimo di ordini nella griglia, ad esempio se=3, allora il numero massimo di ordini nella griglia sarà 3
Dist = Distanza tra due ordini pendenti

Lommultiplicatore = Il rapporto della dimensione del lotto dell'ordine successivo nella griglia.

Magic= numero magico

Usciamo dal commercio come nel codice iniziale, cioè tutti gli ordini nella griglia saranno chiusi alla chiusura del 1° ordine.

Questo è tutto
Se qualcuno otvezvayut sarebbe molto grato!
Sarei molto grato! Forse qualcuno ha un Expert Advisor già pronto, che è già implementato nella vita, anche, farà.
 
sannin:

c'è per esempio un ordine a 1200 punti già... e il prezzo è sceso, per esempio, e le stelle sono allineate in modo che in questo posto l'ordine deve essere piazzato... e l'ordine è già lì e non abbassare il saldo sotto quello richiesto per non mettere 2 ordini da uno, diciamo

Va più o meno così:

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

Per controllare se c'è un ordine BuyStop sul simbolo corrente al prezzo di 1,35000 con Magic, chiamiamo la funzione:

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

Se state parlando di documentazione, evidenziate la parola nel MetEditor e premete F1. O andare online, per esempio:
https://docs.mql4.com/ru/customind/SetLevelStyle

Naturalmente grazie, ma se sei troppo pigro per leggere la domanda, allora che senso ha rispondere? Posso cambiare il valore, lo spessore, il colore e lo stile dei livelli nell'indicatore nelle due funzioni che ho. Non ho accesso alla descrizione. Lo chiedo di nuovo, qualcuno conosce la risposta? Non so se l'ho già visto.

Ho allegato una foto per mostrare ciò di cui ho bisogno.