[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 509

 

edyuson:
Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.

sergeev:

fazer um contador int e acrescentar +1 em cada abertura.

Uma vez definido o valor correto do contador, deixar fazer também o lote*koef.


Sim, não é tão fácil quanto eu pensava, agora está começando a ocorrer. E o ciclo: lote-0.01, lote-0.01, lote-0.01 e somente depois de multiplicar lote-0.02, lote-0.02, lote-0.02 mais: lote-0.04, lote-0.04, lote-0.04 .... deve ser interrompido pelo lucro e continuar com lotes. Havia algumas variantes dos caras no outro fórum sobre isso: Você poderia declarar duplo koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 . 0, 1.0, 2.0 .......} - como uma matriz, preenchendo-a com os coeficientes necessários, e uma variável estática ou global int k=0;
Depois lot=lot*koef[k++]; Série inicial: k=0;

e tais:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } mas tudo está errado.

Eu tentei um contador como: int j;
for(j=0; j<15; j++)
, mas novamente não é o mesmo. Aqui está tudo:
int X=0;
double S = 0,0000;
external double lot=0,01;
external double koef=2,0;
external int SL=30;
external int TP=120;
double dl;
double a;
int init()
{
a=lot;
return(0);
}
int deinit()
{
return(0);
}

int start()

{
if(OrdersTotal() == 0 && X===1)
{
if (Close[0]>dl){lot=a;}
X=0;
}

if(OrdersTotal() == 0 && X===2)
{
if (Close[0]<dl){lot=a;}
X=0;
}


se (OrderTotal() == 0 && Close[1]>Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-SL*0.0001,Ask+TP*0.0001,",14774,0,Blue);
//

lot=lot*koef;
X=1;
}

if(OrdersTotal() == 0 && Close[1]<Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+SL*0.0001,Bid-TP*0.0001,",14774,0,Red);
//sudy some haler may help
lot=lot*koef;

X=2;
}
}
return(0);
//É apenas um martin

 

Obrigado, mas veja, há dois preços, um é o preço de abertura do pedido, e o outro é o preço de stop loss, o número de pontos para o stop loss e o preço do ponto são conhecidos. Como calcular o tamanho do lote para que a perda seja de 10% do depósito se o preço atingir o limite de perda? Eu simplesmente não sou bom com números.

Eu também não entendo

Para taxas cruzadas, o valor do ponto, expresso em dólares, é calculado pela fórmula
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
onde LOT_SIZE é o tamanho do lote, TICK_SIZE é o tamanho do tick, BASE_QUOTE é a cotação atual da moeda base (primeira) para o dólar americano, CURRENT_QUOTE é a cotação atual do par.

Como você entende esta primeira moeda para o dólar americano?

 

Sim... apertado... :-)

a moeda base (primeira) para o dólar americano, é, no exemplo GBP para JPY - GBP/JPY, seriaGBP/USD

Rediz este script, que é o que você precisa com o cálculo do volume da posição negociada, dependendo da quantidade de capital e do tamanho do stop-loss.

Você também precisa dele - "Eu enfrentei um problema e já estou lutando há três dias e não consigo resolvê-lo". No Expert Advisor acabado, decidi, em vez de um lote para entrar na % de risco, então preciso calcular o lote para parar, por exemplo, a 10 000 depo o risco de 1% em uma parada de 100 pontos será cerca de 0,1 lote e aqui a 200 parada de lote o lote deve ser 0,05, então o risco de 1% permaneceu no mesmo nível. Espero que tudo esteja claro. E aqui você está escrevendo:

"Como calcular o tamanho do lote para que a perda seja igual a 10% do depósito, por exemplo, se o preço atingir um stop loss? Eu simplesmente não sou bom com números".

Portanto, modifiquei a função de cálculo de lote a partir do tutorial - sua descrição e abordagem é a mesma, somente que ao invés de cálculo de lote por porcentagem do tamanho do depósito, o lote negociado é calculado exatamente pelas suas (dadas por mim neste exemplo - ver script, link acima) condições:

extern string A0 = "Параметры ММ и мониторинга";
extern double Lots = 0;           // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лосса
extern int StopLoss = 1000;
extern int TakeProfit =4000;      // TakeProfit для новых ордеров (пунктов)
extern  double MaxRisk = 10;      // риск на капитал в %
                                  // рассчитываем объем позиции взависимости от размера стопа, при заданном риске
                                  // например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,
                                  // при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне

int start()
{    
   //----------------------------------СТАРТ------------------------------------------------------------------------------------- 
 
// ...  

//----------------------------------Расчет объема лота------------------------------------------------------------------------ 
  if (Lot(StopLoss)==false)  
                        {
                          Comment(" Пополните счет. Не хватает средств на минимальный лот. Советник остановлен.");// Если средств не хватает на мин, то выход
                          Print  ("Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin()); 
                                                                                                   // Если средств не хватает на мин, то выход
                          return (0);
                        }  
// ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...                          
   Lots_New = NormalizeLots(Lots_New);      

//... здесь условия на открытие поз и установка ордеров

}//------------------------------------------Конец Старт-----------------------------------------------------

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}

//--------------------------------------------------------------------
// Lot.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot(int sl)                               // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots > 0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
  else                                        // Если лоты не заданы
     {                                         // то берём процент 
                                               // Желаем. колич.лотов:
                                               
      Lots_New =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step;
      if(Lots_New<Min_Lot) Lots_New=Min_Lot;
      if(Lots_New>Max_Lot) Lots_New=Max_Lot;
      Print ("Lot_New в ф-ии Lots = ",Lots_New, "ширина канала = ",sl, "Point  = ",Point);
     }
//--------------------------------------------------------------- 5 --
   if (Lots_New < Min_Lot)                     // Если меньше допуст..
      Lots_New=Min_Lot;                        // .. то миниамальный
   if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
      Print ("Не хватает средств на минимальный лот.  Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin());  // Сообщение..
      return(false);                           // ..и выход 
     }
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --
 
Reshetov:
static int Kvadrat = 0;



Eu tentei este método. Agora, durante todo o período de testes, um pedido STOPLOSS pendente foi aberto e é isso... talvez meu terminal esteja com problemas?

O programa deve encontrar preços máximos e mínimos todos os dias, das 7 às 9 horas da manhã e colocar uma ordem de parada nestes níveis.

Arquivos anexados:
 
mamba5:


Eu tentei este método. Agora, durante todo o período de testes, um pedido STOPLOSS pendente foi aberto e é isso... talvez meu terminal esteja com problemas?

Você tem dificuldade em olhar no tronco para ver o que exatamente está falhando?
 

Olá.

Alguém teve algum problema com a função

IsDemo()

?

Sempre consigo 1 resultado - que a conta é real (não importa se é real ou demo).

 
nemo811:

Olá.

Alguém teve algum problema com a função

?

Sempre recebo 1 resultado - minha conta é real (não importa se é real ou demo).

Coloco um EA em um gráfico com um código em uma conta demo:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Escreve na revista: "Esta é uma demonstração.
 
Reshetov:

Eu tenho uma conta demo com um EA com código no gráfico:

Ele escreve no diário de bordo: "Esta é uma demonstração.

Tenho uma demonstração em um phibogroup - por alguma razão misteriosa, diz que estou em uma conta real. Em sua versão ele mostra - Isto não é uma demonstração.

Acontece que, de alguma forma, o CD em si é pervertido

 
nemo811:

Tenho uma demonstração sobre o phibogroup - por alguma razão misteriosa, diz que estou no real. Em sua versão da foto - Não é uma demonstração.

Acontece que, de alguma forma, o CD em si se tornou pervertido

Alguns corretores fornecem um servidor tanto para demonstração quanto para real. Verifique com o apoio do corretor.
 
Reshetov:
Alguns corretores têm um servidor tanto para demonstração quanto para real. Verifique com o departamento de suporte do seu corretor.

Obrigado.