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

 
Link_x:

E se avete intenzione di smontare la funzione, non avreste dovuto tagliare l'intestazione della funzione, lì ci sono informazioni importanti.

Restituisce il tipo dell'ultima posizione aperta o -1 - questo significa che se non ci sono posizioni chiuse, allora quando la funzione viene chiamata, il suo valore sarà uguale a -1

sy - nome dello strumento (coppia di valute)

mn - numero magico. Se impostiamo -1, la funzione restituirà il tipo dell'ultimo ordine chiuso indipendentemente dal numero magico

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
 
Link_x:
Risposta punto per punto, scusate.
1 - genio della programmazione?
2 - per essere giusti, nulla è superfluo tranne le feci e altri prodotti di decomposizione (opinione franca, pronto a iniziare a discutere, ma in un altro thread :) ).
3 - ora tutto ha un senso. :)
4 - così vero. Lo so, mi sono un po' "sbagliato" e ho digitato con la funzione "OrderSend".

Grazie per aver contribuito al template "Function-Brick parsing". :)

1. facciamo a meno del sarcasmo, va bene? Ha reso l'apprendimento comodo e facile. Cosa c'entra il genio?
2. Argomentativo.
3. Non capisci un accidente, a giudicare dai tuoi commenti nel codice.
4. Succede.

int GetTypeLastClosePos(string sy="", int mn=-1) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal(), r=-1;          // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   if (sy=="0") sy=Symbol();                          // Если в функцию в качестве значения символа передан NULL, то будет использоваться текущий символ графика
   for (i=0; i<k; i++) {                              // Цикл по истории от нуля до OrdersHistoryTotal()
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if ((OrderSymbol()==sy || sy=="") &&         // если переданный символ совпадает с символом ордера или передано значение по-умолчанию
             (mn<0 || OrderMagicNumber()==mn)) {      // если передано значение по-умолчанию или магик ордера равен переданному в функцию значению
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // если это или Buy или Sell
// --------------------- определение последнего закрытого ордера --------------------               
               if (t<OrderCloseTime()) {                       // если значение, записанное в t меньше времени закрытия ордера
                  t=OrderCloseTime();                          // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
                  r=OrderType();                               // запоминаем тип ордера
                  }                                            // Конец блока определения времени закрытия.
               }                                               // Конец блока обработки найденного нужного ордера по типу (одного из возможных)
            }                                                  // Конец блока проверки по символу и магику
         }                                                     // Конец блока обработки выбранного ордера
      }                                                        // Идём проверять следующий ордер (если i всё ещё меньше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                                  // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                              // Аминь. 

Sul punto 2, un esempio:

int GetTypeLastClosePos(string sy, int mn) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal()-1, r=-1;        // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   for (i=k; i>=0; i--) {                             // Обратный цикл по истории от OrdersHistoryTotal()-1 до нуля 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if(OrderMagicNumber()!=mn) continue;         // если магик не тот - идём выбирать следующий ордер в истории
         if(OrderSymbol()!=sy)      continue;         // если переданный символ не равен символу ордера - идём выбирать следующий ордер в истории
         if (OrderType()>1)         continue;         // если это не Buy и не Sell - идём выбирать следующий ордер в истории
// --------------------- дальше имеем выбранный нужный нам ордер --------------------        
// -------------------------- определяем время его закрытия -------------------------               
         if (t<OrderCloseTime()) {                    // если значение, записанное в t меньше времени закрытия ордера
            t=OrderCloseTime();                       // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
            r=OrderType();                            // запоминаем тип ордера
            }                                         // Конец блока определения времени закрытия.
         }                                            // Конец блока обработки выбранного ордера
      }                                               // Идём проверять следующий ордер (если i всё ещё больше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                         // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                     // Аминь. 

Ci sono meno cose inutili

 
Link_x:

Ecco un esempio di uso pratico di una funzione personalizzata:

.
Grazie.
Quindi bisogna applicare il nome della funzione per usarla, e la variabile "r" stessa è impostata per determinare il valore di quella funzione!
Ecco una piccola scoperta per me! ^^
Grazie ancora, Yuri. :)


Per un ultimo chiarimento, questo è possibile:



I vostri esempi non sono corretti. Quando chiamate una funzione che ha dei parametri, dovete dare i valori di questi parametri tra parentesi, separati da virgole. Dovete anche sapere che non a tutte le funzioni vengono assegnati dei valori. Se il tipo di funzione è void, non ha alcun significato ed è destinata ad eseguire qualche azione o calcolare qualche variabile. In quest'ultimo caso, dovete conoscere i nomi di queste variabili per utilizzare i risultati della funzione.

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

Il compilatore vi darà un errore su questa linea che la variabile non è dichiarata.

dovresti almeno fare questo:

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

Sul punto 2, un esempio:

Ci sono meno articoli non necessari



Scusa la domanda stupida, ma perché stai scavando in tutta la storia per trovare l'ultimo ordine chiuso? Trovate il primo dalla fine e uscite subito, credo.
 
Roger:


Scusa la domanda stupida, ma perché stai scavando nella storia per trovare l'ultimo ordine chiuso? Si trova il primo dalla fine e si esce immediatamente, a quanto ho capito.
Una volta ci fu una discussione su un problema quando la cronologia veniva memorizzata nella forma in cui l'utente la ordinava. Quindi (per essere sicuri) la ricerca è esattamente così.
 
artmedia70:
Una volta c'è stata una discussione su un problema in cui la cronologia veniva memorizzata come l'utente la ordinava. Quindi (per essere sicuri) la ricerca è esattamente così.

L'utente può solo ordinare la storia per la percezione visiva, i numeri di posizione nella storia non possono essere cambiati.
 
Roger:
L'utente può solo ordinare la storia visivamente, i numeri di posizione nella storia non possono essere cambiati.

Questa è una buona cosa. Ma una volta era diverso. Ora non cercherò informazioni sul forum - è stato molto tempo fa. Così mi sono chiesto: e se succedesse di nuovo? Preferisco eseguire gli ordini piuttosto che ottenere un risultato sbagliato.
 
Roger:
L'utente può solo ordinare la storia visivamente, i numeri di posizione nella storia non possono essere cambiati.

In realtà, si può solo sperare nell'ordine nel tester.
 
TheXpert:
In realtà, si può solo sperare nell'ordine nel tester.


Non l'ho notato, ma va bene, non voglio discutere. Fai la profondità 10-20, dovrebbe essere sufficiente. Ma tutta la storia... Questo è un po' troppo, secondo me.