Caratteristiche utili da KimIV - pagina 19

 

Funzione GetProfitOpenPosInCurrency().

Questa funzione restituisce il profitto totale delle posizioni attualmente aperte. Il profitto viene restituito in unità della valuta del deposito. Una selezione più accurata delle posizioni da prendere in considerazione è specificata utilizzando parametri esterni:

  • sy - Nome dello strumento di mercato. Se si specifica questo parametro, la funzione considererà solo le posizioni di questo strumento. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}
HH. In allegato c'è uno script per testare la funzione GetProfitOpenPosInCurrency().
 
KimIV:
scorpionk:

Codice sbagliato, non è 131, è 130.

Capisco...

Provate a normalizzare come segue:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Lo faccio e non incontro l'errore 130.

Questo è il modo in cui porto il prezzo, usando solo le cifre. Ma non aiuta, l'errore non appare sempre, solo in alcuni casi, e non ho scoperto da cosa dipende. Probabilmente dovrei usare le mani per controllare i valori di uscita che cercano di essere impostati dal robot.

 

Alla luce dei possibili sviluppi futuri, questa aggiunta sarà utile:

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
Mi chiedo se ce ne sarà uno su cinque...? ;)))

Grazie ancora per il consiglio su come riassumere i dati nel ciclo!

 

Yo-yo, stai scherzando? Il mio compilatore non capisce OrderTaxes().

 

Certo!!! :)))

Lo si può vedere nell'evidenziazione, e nel commento l'ha chiaramente indicato...

Anche se è una delle proprietà di un ordine, o meglio di una posizione, e tale funzione dovrebbe in linea di principio essere...

-

E se il compilatore non capisce...

Il GNI ci insegnerà ;)

 

Funzione GetProfitOpenPosInPoint().

Questa funzione restituisce il profitto totale delle posizioni attualmente aperte. Il profitto viene restituito in punti. Una selezione più accurata delle posizioni da prendere in considerazione è specificata da parametri esterni:

  • sy - Nome dello strumento di mercato. Se si specifica questo parametro, la funzione considererà solo le posizioni di questo strumento. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
HH. In allegato c'è uno script per testare la funzione GetProfitOpenPosInPoint().
 
KimIV:

In questo thread posterò i codici delle mie funzioni in MQL4, darò esempi del loro uso, e risponderò alle domande relative al loro uso. Ogni funzione sarà pubblicata in due post. Il primo post conterrà il codice della funzione, il secondo - esempi di utilizzo e brevi spiegazioni. A volte allegherò il codice di uno script al secondo post per testare effettivamente la funzione e visualizzare i risultati.

Inizierò con le funzioni per gestire gli ordini come richiesto da Lukyanov nel topic "Come eseguire due EAs allo stesso tempo" alla fine.

La prima è la funzione di impostazione degli ordini (versione tester MT4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+

Ciao, per favore aiutami a scrivere un EA. Non ne so molto ma sembra una buona idea. Il significato dell'idea nel seguito se è certamente possibile.
È necessario che si aprano due offerte simultaneamente una Sell e una Buy con parametri (lots=0.1____TafeProfit=30______StopLoss=10) e alla chiusura della perdita si apra la seconda positiva con parametri (lots=1____TafeProfit=30______StopLoss=10)
Se non hai intenzione di mandarmi a zonzo... allora idealmente le due scommesse iniziali si aprirebbero a candela bassa o alta o alla comparsa di una nuova candela, ma se la seconda parte dello scritto è troppo lunga fai almeno la prima parte dei miei sproloqui

Grazie mille in anticipo !!!! Se lo scrivi, mettilo qui vms.80@mail.ru



 

Funzione GetTicketLastPos().

Questa funzione restituisce il biglietto dell'ultima posizione aperta o -1. Una selezione più accurata delle posizioni da prendere in considerazione è specificata da parametri esterni:

  • sy - Nome dello strumento di mercato. Se si specifica questo parametro, la funzione considererà solo le posizioni di questo strumento. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
HH. In allegato c'è uno script per testare la funzione GetTicketLastPos().
 
WoodyVMS:

Non so cosa farci, ma ho un'idea di cosa farci. Non ne ho idea, ma potrebbe essere una buona idea. Il succo è il seguente, se è possibile.
È necessario che apra due offerte simultaneamente una Sell e una Buy con parametri (lots=0.1____TafeProfit=30______StopLoss=10) e alla chiusura della perdita apra la seconda positiva con parametri (lots=1____TafeProfit=30______StopLoss=10)
Se non hai intenzione di mandarmi sul hoo... allora idealmente le due scommesse iniziali si aprono al minimo o al massimo della candela o alla comparsa di una nuova candela, ma se la seconda parte di scrivere long fare almeno la prima parte delle mie divagazioni

Grazie mille in anticipo !!!! Se lo scrivi, mettilo qui vms.80@mail.ru

O forse inviare al compagno tutti gli EA di CodeBase a questo indirizzo.

Scusa, Igor, per essere fuori tema. Semmai lo cancellerò.

 
Vinin писал (а):
O forse inviare al compagno tutti gli EA di CodeBase a questo indirizzo.
Lo troverà da solo...