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

 
wishmast:

Ragazzi, mi sono già scervellato. Come faccio a fare in modo che l'EA piazzi ordini pendenti sui massimi e minimi, per esempio 8 candele, con un take profit di 1/4.

Faccio qualcosa del genere:

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

doppio TP=((Vhod1-Vhod2)/4)+Vhod1;


Ho provato a cambiare i parametri, ma continua ad ottenere stop sbagliati o imposta il prezzo a 7.00000; non è chiaro da dove viene

iHighest, iLowest vi darà l'indirizzo della candela, ma non il prezzo.
 
evillive:
iHighest, iLowest darà l'indirizzo della candela, non il prezzo.

Proprio così. Abbiamo bisogno di

double Vhod1=iHigh(Symbol(), 0, iHighest(Symbol(),0,MODE_HIGH,8,0));

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0));

 
alvlaf:


L'ho messo male, ma non avrebbe comunque funzionato bene perché... Perché). Comunque, dovrebbe andare così:

1) creare una variabile AllowNewOrders nell'inite (se non esiste)

2) Creare un nuovo ordine, fino a quando si chiude, OnTick di questo simbolo è inattivo, ma verrà eseguito OnTick di un altro simbolo

3) Eseguire il passo 2 per gli altri simboli fino al raggiungimento del limite MaxOpenOrders

4) quando l'ordine finisce, se è in perdita o ha valore zero, proibire l'apertura di nuovi ordini per tutte le copie attraverso AllowNewOrders

[ecco il problema immediato - quando la serie perdente finisce, AllowNewOrders=1, ma cosa succede se MaxOpenOrders>1 e ci sono diverse di queste sessioni?]

5) Se il punto 4 non è soddisfatto, allora puoi aprire nuovi ordini.

Il programma DEVE funzionare quando MaxOpenOrders=1. Forse, ci sarà un problema se vietiamo nuovi ordini dopo un ordine non redditizio AllowNewOrders=0 e il prossimo OrderSend, per qualche motivo, non apre l'ordine. Scriverò qui sotto come mi copro per questo caso...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

Scriverò di seguito come mi copro per questa eventualità...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

Se la soluzione dell'errore è prevista correttamente, il tasso di successo dell'apertura di un ordine aumenta.

 
Ciao! Per favore consigliatemi se uso la funzione del post (ogni ordine ha il suo mago) - http://forum.forexpeoples.ru/showthr...=1#post1715092 , come sarebbe per trovare gli ultimi ordini di vendita o di acquisto, o l'aggiornamento di una serie di ordini se non ogni ordine ha il suo mago, ma ogni serie di ordini ha il suo mago. Cioè si suppone che quando si apre una nuova serie di ordini con il suo proprio magik, le vecchie serie di ordini continuano ad aprire i loro propri ordini con i loro propri magik. Ogni serie dovrebbe avere il suo profitto e ci sono molte di queste serie di ordini.

Come può cambiare il codice qui sotto in queste condizioni?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderSymbol()!=Symbol()) continua; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continua;

Ho messo il codice per generare un magik quando si aprono i primi ordini di una serie, ma ecco il problema quando si aprono nuovi ordini nella stessa serie.

Il codice stesso per generare la magia dal post:
//+------------------------------------------------------------------+
// ottenere la prossima magia nella serie
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
}

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

if (magic == EMPTY){
magic = startMagicNumber; // primo della serie
} else {
magic++; // prossimo della serie
}

return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: controlla se c'è un ordine nel mercato con una data magia
int checkMarketByMagic(int magic){
for(int i = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continua;
if(OrderSymbol() != Symbol()) continua;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
 
Buon pomeriggio signori del forum,
scusate se ho confuso i thread, ma non ho trovato il posto giusto per postare il TEMA, quindi non cacciatemi.

A volte, navigando in Internet alla ricerca di nuovi Expert Advisors, mi sono imbattuto in uno a cui non ho prestato attenzione, perché la sua descrizione era standard, di cui ce ne sono molti.

Se non l'avessi visto o letto, per favore datemi il nome, e google farà il suo lavoro o se ne ho uno, lo prenderò come regalo. Forse c'è un consigliere simile che esegue azioni simili.

Descriverò il significato dell'Expert Advisor (non c'è niente di molto sofisticato, quello di cui ho bisogno ora).

Approssimativamente, il lavoro sarebbe così:

1. Aprire una posizione manualmente, per esempio comprare.
2. L'Expert Advisor imposta Stop Loss e Take Profit in base alle impostazioni.
3. L'ordine viene chiuso al takeprofit - l'EA apre immediatamente un altro acquisto e imposta gli stessi stoploss e takeprofit fino a quando non raggiunge il primo stoploss o se c'è un takeprofit finale.
4. Se la posizione è chiusa da Stop Loss, il robot non fa più nulla. L'Expert Advisor attende che il prossimo ordine venga aperto manualmente.

Questo è tutto.

Te ne sarei molto grato.
 
A13ksandr:


L'ho inserito in modo errato, ma ancora non funzionerebbe come dovrebbe perché... Perché). Comunque, va così:

1) creare una variabile AllowNewOrders nell'initem (se non esiste)

2) Creare un nuovo ordine finché non si chiude OnTick di questo simbolo è inattivo, ma OnTick dell'altro simbolo funziona

3) Eseguire il passo 2 per gli altri simboli fino al raggiungimento del limite MaxOpenOrders

4) quando l'ordine finisce, se è in perdita o ha valore zero, proibire l'apertura di nuovi ordini per tutte le copie attraverso AllowNewOrders

[ecco il problema immediato - quando la serie perdente finisce, AllowNewOrders=1, ma cosa succede se MaxOpenOrders>1 e ci sono diverse di queste sessioni?]

5) Se il punto 4 non è soddisfatto, allora puoi aprire nuovi ordini.

Il programma DEVE funzionare quando MaxOpenOrders=1. Forse, ci sarà un problema se vietiamo nuovi ordini dopo un ordine non redditizio AllowNewOrders=0 e il prossimo OrderSend, per qualche motivo, non apre l'ordine. Scriverò di seguito come sto coprendo per questo caso.

Grazie Alexander, lo controllerò domani. [da qui, il problema immediatamente - quando la serie perdente finisce, AllowNewOrders=1, e se MaxOpenOrders>1 e ci sono diverse sessioni?] Se MaxOpenOrders>1 di un certo valore, allora in idea AllowNewOrders=1 dovrebbe anche essere maggiore dello stesso valore. Ma non abbiamo bisogno di preoccuparci di questo e MaxOpenOrders dovrebbe essere rimosso del tutto, perché in questa versione del programma non è comunque prevista più di una serie.
 
alvlaf:
Grazie Alexander, lo controllerò domani. [da qui il problema immediato - quando la serie perdente finisce, AllowNewOrders=1, ma se MaxOpenOrders>1 e c'è più di una sessione?] Se MaxOpenOrders>1 di un certo valore, allora in idea AllowNewOrders=1 dovrebbe anche essere maggiore dello stesso valore. Ma non ho bisogno di preoccuparmene per ora e MaxOpenOrders dovrebbe essere omesso del tutto, perché in questa versione del programma non è comunque prevista più di una serie.
L'ho provato, ha funzionato bene per i primi cinque minuti, poi ho iniziato ad aprire diverse offerte (4) contemporaneamente e per la stessa coppia con lotto più grande. Alexander, non ho capito bene come la variabile globale ottiene e cambia il suo valore nella tua versione?
 

Ciao a tutti!

Ecco un oggetto grafico su un grafico.

I suoi parametri sono tempo, valore, codice. Il valore corrisponde al prezzo al quale si trova l'oggetto.

C'è un modo per ottenere il suo tempo e il suo valore (attraverso una funzione o qualcos'altro)?

\\\\\

Oppure, in un contesto più ampio, ci sono degli oggetti (a parte le linee di tendenza, le linee di Fibonacci, le Gannet) che ci permettono di ottenere istantaneamente il loro tempo e il loro prezzo?

Ho bisogno di mettere alcuni segni sul grafico e ottenere informazioni da essi. Disegnare linee di tendenza, fibo, ecc... - È terribilmente ingombrante e lento...

Grazie per le risposte!

PS Ho appena iniziato a studiare...

 
ilmel:

Ciao a tutti!

Ecco un oggetto grafico su un grafico.

I suoi parametri sono tempo, valore, codice. Il valore corrisponde al prezzo al quale si trova l'oggetto.

C'è un modo per ottenere il suo tempo e il suo valore (attraverso una funzione o qualcos'altro)?

\\\\\

Oppure, in un contesto più ampio, ci sono degli oggetti (a parte le linee di tendenza, le linee di Fibonacci, le Gannet) che possono essere derivati immediatamente al tempo e al prezzo?

Ho bisogno di mettere alcuni segni sul grafico e ottenere informazioni da essi. Disegnare linee di tendenza, fibo, ecc... - È terribilmente ingombrante e lento...

Grazie per le risposte!

PS Ho appena iniziato a studiare...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger
Motivazione: