Características úteis da KimIV - página 19

 

Função GetProfitOpenPosInCurrency().

Esta função retorna o lucro total das posições atualmente abertas. O lucro é devolvido em unidades da moeda do depósito. Uma seleção mais precisa das posições a serem levadas em conta é especificada usando parâmetros externos:

  • sy - Nome do instrumento de mercado. Se você especificar este parâmetro, a função considerará apenas as posições deste instrumento. O valor padrão "" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. Anexado um roteiro para testar a função GetProfitOpenPosInCurrency().
Arquivos anexados:
 
KimIV:
escorpião:

Código errado, não é 131, é 130.

Estou vendo...

Tente normalizar como se segue:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Eu o faço e não encontro erro 130.

É assim que eu trago o preço, usando apenas Dígitos. Mas isso não ajuda, o erro nem sempre aparece, apenas em alguns casos, e eu não descobri do que depende. Provavelmente eu deveria usar minhas mãos para verificar os valores de saída tentando ser definidos pelo robô.

 

À luz de possíveis desenvolvimentos no futuro, esta adição virá a calhar:

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
Será que haverá um em cinco...? ;)))

Mais uma vez obrigado pela dica de como resumir os dados no loop!

 

Yo-yo, você está brincando comigo? Meu compilador não entende OrderTaxes().

 

É claro!!! :)))

Você pode vê-lo no destaque, e no comentário claramente apontado.

Embora seja uma das propriedades de uma ordem, ou melhor, de uma posição, e tal função deveria em princípio ser...

-

E se o compilador não entender...

O GNI vai nos ensinar ;)

 

Função GetProfitOpenPosInPoint().

Esta função retorna o lucro total das posições atualmente abertas. O lucro é devolvido em pontos. Uma seleção mais precisa das posições a serem levadas em conta é especificada por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se você especificar este parâmetro, a função considerará apenas as posições deste instrumento. O valor padrão "" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. Anexado um script para testar a função GetProfitOpenPosInPoint().
Arquivos anexados:
 
KimIV:

Nesta linha eu colocarei os códigos de minhas funções na MQL4, darei exemplos de seu uso e responderei perguntas relacionadas ao seu uso. Cada função será publicada em dois posts. O primeiro post conterá o código de função, o segundo - exemplos de uso e breves explicações. Às vezes eu anexarei o código de um script ao segundo post para realmente testar a função e exibir os resultados.

Começarei com funções para lidar com os pedidos de acordo com o pedido de Lukyanov no tópico "Como executar dois EAs ao mesmo tempo" no final.

Que a primeira seja a função de ajuste do pedido (versão de teste 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);
  }
}
//+----------------------------------------------------------------------------+

Olá, por favor, me ajude a escrever um EA. Não sei muito sobre isso, mas me parece uma boa idéia. O significado da idéia a seguir, se for certamente possível.
É necessário que se abram duas licitações simultaneamente uma Venda uma Compra com parâmetros (lotes=0,1____TafeProfit=30______StopLoss=10) e no fechamento da perda se abra a segunda positiva com parâmetros (lotes=1____TafeProfit=30______StopLoss=10)
Se você não vai me mandar no casco... então idealmente as duas apostas iniciais se abrem no mínimo ou no máximo na vela ou na aparência de uma vela nova, mas se a segunda parte de escrever muito tempo faz pelo menos a primeira parte das minhas divagações

Muito obrigado de antemão !!!! Se você o escrever, coloque-o aqui vms.80@mail.ru



 

Função GetTicketLastPos().

Esta função devolve o bilhete da última posição aberta ou -1. Uma seleção mais precisa das posições a serem levadas em conta é especificada por parâmetros externos:

  • sy - Nome do instrumento de mercado. Se você especificar este parâmetro, a função considerará apenas as posições deste instrumento. O valor padrão "" significa qualquer instrumento de mercado. NULL significa o instrumento atual.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição, MagicNumber. O valor padrão -1 significa qualquer identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. Anexado um roteiro para testar a função GetTicketLastPos().
Arquivos anexados:
 
WoodyVMS:

Não sei o que fazer com ele, mas tenho uma idéia do que fazer com ele. Eu não tenho idéia, mas pode ser uma boa idéia. A essência é a seguinte, se for possível.
É necessário que sejam abertas duas licitações simultaneamente uma Venda uma Compra com parâmetros (lotes=0,1____TafeProfit=30______StopLoss=10) e ao fechar a perda abre a segunda positiva com parâmetros (lotes=1____TafeProfit=30______StopLoss=10)
Se você não vai me mandar no casco... então o ideal seria que as duas apostas iniciais se abrissem com vela baixa ou alta ou com o aparecimento de uma vela nova, mas se a segunda parte da escrita for muito longa faça pelo menos a primeira parte das minhas divagações

Muito obrigado de antemão !!!! Se você o escrever, coloque-o aqui vms.80@mail.ru

Ou talvez enviar ao camarada todos os EAs da CodeBase para este endereço.

Desculpe, Igor, por estar fora do tópico. Se houver alguma coisa, eu a apagarei.

 
Vinin писал (а):
Ou talvez enviar ao camarada todos os EAs da CodeBase para este endereço.
Ele mesmo o encontrará...