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

 
evillive:

Se prendete il vostro numero 108, otterrete al massimo 151 alla potenza di 151 - 108^151=1.11426138071861e+307

108^152=1.20340229117609e+309 è troppo per la programmazione MCL, figuriamoci 108^4096

Che tipo di calcoli richiederebbe una tale scala?


Sto cercando di sintetizzare l'analisi del movimento dei prezzi e la gestione dell'attenzione nlp, e il cervello con il pilota automatico :)
 
alex12:
Sto cercando di sintetizzare l'analisi del movimento dei prezzi e la gestione dell'attenzione della nlp, e il mio cervello ha il pilota automatico :)
Nella ricerca dell'illuminazione, la cosa principale è scegliere le sostanze giuste per non volare troppo lontano
 

Ho iniziato a imparare MQL4 e non riesco a capire come viene selezionato un ordine

dal tutorial:

for(int i=1; i<=OrdersTotal(); i++) // Il ciclo degli ordini

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Se

{

se (OrderSymbol()!= Symb) continua;

La mia comprensione è: Per i=1 finché i<= Numero di ordini

Se l'ordine selezionato nella posizione i-1 (cioè l'ordine #0) esiste

Abbinalo al simbolo

Poi aggiungere 1(i++) a i e iniziare una nuova iterazione

Non capisco il commento // Se c'è un prossimo ordine (cosa intendete: prossimo per posizione o questo ordine che è attualmente selezionato?)

Si prega di spiegare in russo.

 
Se c'è un ordine, cioè esiste sotto il numero e-1, allora passa alla condizione successiva.
 
Vladon:
Se c'è un ordine, cioè esiste sotto il numero e-1, allora passa alla condizione successiva.

Troverà sempre un ordine con il numero zero (che è i-1). Che metodo assurdo per determinare il "prossimo" ordine, veramente fuorviante...
 
Grazie per le spiegazioni.
 
evillive:

Troverà sempre un ordine con numero zero (che è i-1). Questo è un metodo selvaggio per determinare l'ordine "successivo", che è veramente fuorviante...


Se non ci sono ordini allora con questo disegno:

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;

non passerà alla condizione successiva.

perché non c'è ordine e-1 (nel nostro caso =0)

Naturalmente, non è conveniente scriverlo in questo modo e non è chiaro perché dovrebbe essere così,

e non, per esempio, in questo modo:

for(int i=0; i<OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;
 

Ciao signor programmatori, ho una domanda, non riesco a imparare una parte del codice per chiudere la percentuale del saldo del conto. si chiude non la percentuale ma tutti in una volta e tutti gli ordini che sono nel mercato. ho bisogno che si chiuda un ordine specifico e la percentuale calcolata del saldo del deposito.consiglio cosa faccio male?


extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdiniTotali()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;
if(stop<=AccountBalance())
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}////(ostop==AccountBalance()/100*Percent)
}//// (OrderSymbol() == Symbol() )
}// (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//// for(int i = OrdersTotal()-1; i>=0; i--)
return;
}////void OnStart()
//+-----------------------------------------------------------------

 
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);

com'è?

e questo:

if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;

non si realizzerà mai.

quindi:

if(stop<=AccountBalance())

funzionerà sempre con ogni ordine.

CONCLUSIONE: tutto è sbagliato.

La tua funzione ha bisogno di essere pensata, non ho una risposta rapida.

ma almeno è così per cominciare:

extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol()) 
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderProfit()>=AccountBalance()/100*Percent)

{
if(OrderType() == OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
if(OrderType() == OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------
 
Vladon:


Se non ci sono ordini in una tale costruzione:

non passerà alla condizione successiva.

perché non c'è ordine e-1 (nel nostro caso =0)

Naturalmente, non è conveniente scriverlo in questo modo e non è chiaro perché dovrebbe essere così,

e non, per esempio, così:


Quando lo stavo leggendo, ho anche pensato perché non mettere semplicemente i=0, sembra essere più semplice e più chiaro.

Ecco l'intero codice dello script, forse c'è una buona ragione per cui l'autore ha messo i=1 invece di i=0. Solo che non ne so abbastanza e potrei semplicemente non vederlo, mentre ho bisogno di capire il meccanismo di funzionamento per non sollevare domande in seguito

// closeorder.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   int Real_Order=-1;                           // Пока рыночных нет
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         int Tip=OrderType();                   // Тип ордера
         if (Tip>1) continue;                   // Отложенный ордер  
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();         // Цена ордера
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< //Выбор
            NormalizeDouble(Dist,Digits))       // самого близкого орд       
           {
            Dist=MathAbs(Price-Win_Price);      // Новое значение
            Real_Order=Tip;                     // Есть рыночный ордер
            int Ticket=OrderTicket();           // Номер ордера
            double Lot=OrderLots();             // Количество лотов
           }
         //------------------------------------------------------ 5 --
        }                                       //Конец анализа ордера
     }                                          //Конец перебора орд.
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
      if (Real_Order==-1)                       // Если рыночных нет
        {
         Alert("По ",Symb," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                        // По типу ордера
        {
         case 0: double Price_Cls=Bid;          // Ордер Buy
            string Text="Buy ";                 // Текст для Buy
            break;                              // Из switch
         case 1: Price_Cls=Ask;                 // Ордер Sell
            Text="Sell ";                       // Текст для Sell
        }
      Alert("Попытка закрыть ",Text," ",Ticket,". Ожидание ответа..");
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрытие ордера
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // Получилось :)
        {
         Alert ("Закрыт ордер ",Text," ",Ticket);
         break;                                 // Выход из цикла закр
        }
      //--------------------------------------------------------- 9 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);//Другие варианты   
        }
      break;                                    // Выход из цикла закр
     }
//-------------------------------------------------------------- 10 --
   Alert ("Скрипт закончил работу -----------------------------");
   return;                                      // Выход из start()
  }