[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 46

 
rustein:

dov'è esattamente la domanda?
 
ilunga:
dov'è esattamente la domanda?
https://www.mql5.com/ru/forum/115354/page78
 

nel codice che hai dato, se c'è solo 1 ordine, il ciclo

for(;Cnt>=0;Cnt--)
    {
      RefreshRates();
      OrderSelect(Cnt,SELECT_BY_POS);
      if(OrderMagicNumber()==Magic)
      {
      TotalOpenOrders++;
      }
    }

La prima volta sarà un tentativo di selezionare un ordine che non esiste

 
ilunga:

nel codice precedente, se c'è solo 1 ordine, il ciclo

La prima volta sarà un tentativo di selezionare un ordine che non esiste

Grazie, lo correggerò da solo.
 
artmedia70:
Il terminale è andato in pensiero profondo, dopo circa 15 minuti l'ho ucciso
niente...
L'avrei ucciso senza aspettare un minuto.
 
PapaYozh:

Immediatamente prima di usare Ask e Bid, eseguire RefreshRates()


Provato, non cambia nulla

Funzione di invio dell'ordine, tutto sembra essere standard

 int OpenPosition(string AdvisorName,int Position,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){double Price = NormalizeDouble(Ask,Digits); 
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){Price = NormalizeDouble(Bid,Digits); 
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} RefreshRates(); while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
 
Dimoncheg:


Provato, non cambia nulla.

Funzione di invio dell'ordine, tutto sembra essere standard


Prima si aggiornano i prezzi con la funzione RefreshRates() e si memorizza il prezzo richiesto in Price.

Poi si esegue Sleep(Interval) e a questo punto le quotazioni cambiano.

Dopodiché si chiama OrderSend() con il preventivo dell'anno precedente.

Cosa si aspetta in risposta?

 
PapaYozh:


Prima si aggiornano i prezzi con la funzione RefreshRates() e si memorizza quello richiesto in Price.

Poi si esegue Sleep(Interval), e in quel momento le quotazioni cambiano.

E dopo si chiama OrderSend() con il preventivo dell'anno prima.

Cosa si aspetta in risposta?


Colpa mia, ho modernizzato un po' nel posto sbagliato, ora ho spostato il prezzo fuori dalla funzione

OpenPosition("Sovetneg",OP_BUY,NormalizeDouble(Ask,Digits),Magic,SlowlyIncreasingLots(0.2),MultiStop(OP_BUY,StopLoss));
La funzione stessa è ora
 int OpenPosition(string AdvisorName,int Position,double Price,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
Ti sembra giusto ora?
 

Salve.

Potresti dirmi cosa significa type==4?

e tipo==5

nel seguente snippet:

double ma=iMA(Symbol(),PERIOD_D1,21,0,MODE_SMA,PRICE_CLOSE,0);

for(int k=1; k<=OrdersTotal(); k++)
bool select=OrderSelect(k-1,SELECT_BY_POS);

if(select)
{
int type=OrderType();
int ticket=OrderTicket();

if (Bid<ma && type==4)
OrderDelete(ticket);
if (Bid>ma && type==5)
OrderDelete(ticket);
}

Capisco che le condizioni per la cancellazione degli ordini, da ma è chiaro, ma insieme come?

Grazie.

 
Dimoncheg:


Non ti sembra giusto ora?


No, non lo è. E' andata anche peggio :)

Capite, RefreshRates() aggiorna i valori delle variabili predefinite Ask e Bid, voi state usando il valore una volta memorizzato nella variabile Price.