Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 70

 
Olá, você poderia me ajudar a escrever uma função no MT4? Conheço meu saldo de conta, sei quantas negociações serão abertas (por exemplo, 9), conheço o risco (por exemplo, 3% do AccountBalance), preciso calcular um lote para a primeira negociação, se cada lote seguinte será duplicado e todas as negociações se sobreporão umas às outras.
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

Isto é o que eu tenho. Por favor, diga-me o que está errado. Agradecemos antecipadamente!

 

Olá!

Estou escrevendo aqui, pois parece não haver ninguém no mq4.

Você pode me dizer o que estou fazendo de errado? A opção 2 não está funcionando.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
Olá, por favor, ajude-me a escrever uma função no MT4. Conheço meu saldo de conta, sei quantas negociações serão abertas (por exemplo, 9), conheço o risco (por exemplo, 3% do AccountBalance), preciso calcular um lote para a primeira negociação, se cada lote seguinte será duplicado e todas as negociações se sobreporão umas às outras.

Isto é o que eu tenho. Por favor, diga-me o que está errado. Agradecemos antecipadamente!

Elementar. O erro é a funçãoGetLots(). A função completa.
 
Leo59:

Olá!

Estou escrevendo aqui, porque parece não haver ninguém no mq4.

Você pode me dizer o que estou fazendo de errado? A opção 2 não funciona.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

Em destaque: deve haver uma tarefa - "=" e você tem uma comparação - "==".

 

Olá a todos!
Estou aprendendo a escrever robôs no mt4, decidi começar com as opções binárias . Eu escrevi a EA mais fácil e o compilador gera um monte de avisos que não consigo entender (
Ajuda: "Oh MQL4 Guru" =))))))
Obrigado de antemão!)

Aqui está o código para a EA.

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider.mq4 |
//|Copyright 2017, Penrov Nikolay |
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#Direitos autorais de propriedade "Copyright 2017, Petrov Nikolay"
#link de propriedade "vk.com/buzamonolit"
#propriedade versão "1.00"
#propriedade rigorosa
//+------------------------------------------------------------------+
//| função de iniciação de especialista|
//+------------------------------------------------------------------+
Exterior int Bolinger_Bands = 20; // Período Bollinger Band
Delta duplo externo = 0,0003; // A que distância para abrir o pedido

Symb; // Nome do instrumento financeiro.
int Total; // Número de pedidos

//+------------------------------------------------------------------+
//| função de iniciação de especialista|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0);
//----
retorno(0);
}
//+------------------------------------------------------------------+
//| função de desinicialização especializada|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
retorno(0);
}
//+------------------------------------------------------------------+
//| função de partida de especialista|
//+------------------------------------------------------------------+
int start()
{
//----
preço duplo = Licitação;
duplo CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
duplo CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
double PriceBol_High = preço - CurrBol_High;
double PriceBol_Low = preço - CurrBol_Low;
data/hora PróximoFechar = Hora[0] + Período()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// Contagem de pedidos
Symb=Símbolo();// Nome da barbatana.símbolo(); // símbolo(); // símbolo(); // símbolo(); // ícone de ordem(); // símbolo().
Total=0;// Número de pedidos
for(int i=1; i<=OrdensTotal(); i++) // Laço de encomenda
{
se (OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // Se houver um próximo
{// Análise de pedidos:
se (OrderSymbol()!=Symb)continuar; // Não nosso instrumento financeiro
se (OrderType()>1)// Temos uma ordem pendente
{
Alerta("Ordem pendente detectada. O Expert Advisor não está funcionando;)
retorno(0);// Saída()
}
Total++;// Mercado de balcão. encomenda
se (Total>1)// Não mais de um pedido
{
Alerta("Várias ordens de mercado. O Expert Advisor não está funcionando");
retorno(0);// Saída()
}
}
}

ObjectSetText("Obj_Label", "TF" + Período() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0], TIME_MINUTES) + ", NC@". + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label2", "Ordens:" + Total + ", delta " + DoubleToStr(Delta,5) + ", distância para MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Ordens: " + Total + ", Delta " + DoubleToStr(Delta,5) + ", distância para MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// análise de preços e abertura de pedidos

if ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Verde) >0) Imprimir ("Opened OK");
senão
{
err=GetLastError();
Imprimir("erro(",err,"));
retorno(0);

}
Imprimir ("CALL @ " + preço + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp em " + MinutesToNextClose);

}

if ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Vermelho) > 0) Imprimir ("Opened OK");
senão
{
err=GetLastError();
Imprimir("erro(",err,"));
retorno(0);

}
Imprimir ("PUT @ " + preço + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp em " + MinutesToNextClose);

}

//----
retorno(0);
}
//+------------------------------------------------------------------+

int Initialize_Objects(int Win) // Usuário fie
{// .criação de objetos
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // criação de objetos
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Ligar a um canto
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // coordenada X
se (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);// Coordenada Y
senão
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);// Coordenada Y

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // Criação de objetos
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // Encadernação a um canto
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // coordenada X
se (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);// Coordenada Y
senão
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y Coordinate

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Criar objeto
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // Encadernação a um canto
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // coordenada X
se (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);// Coordenada Y
senão
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y Coordinate

retorno(0);// Saída do usuário.função
}

 

Aqui estão os avisos. Eu não consigo descobrir do que ele não gosta(


possível perda de dados devido à conversão do tipo Bolinger_Bands_traider.mq4 51 24
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 76 35
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 76 227
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 77 43
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 78 43
conversão implícita de 'string' para 'número' Bolinger_Bands_traider.mq4 85 71
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 93 23
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 93 91
conversão implícita de 'string' para 'número' Bolinger_Bands_traider.mq4 99 72
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 107 23
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 107 91
0 erro(s), 11 advertência(ões), tempo de compilação: 204 msec 1 12

 
Vitalie Postolache:
Elementar. O erro é a funçãoGetLots(). A função completa.

Talvez você possa me dizer como escrevê-lo corretamente. Eu queria calcular usando loop by brute forcing do lote máximo.
 
Arseniy Barudkin:

Talvez você possa me dizer como escrevê-lo corretamente. Eu queria calcular usando um laço, tentando a partir do lote máximo.


Onde está a lógica? Você fixa o lote máximo permitido para a primeira encomenda e depois o aumenta para cada encomenda sucessiva. Isso não lhe parece, para dizer de forma branda, pouco sensato?

Além disso, você diminui o lote da primeira ordem no laço usando algum método totalmente incompreensível, enquanto os lotes das outras ordens que foram "calculadas" antes permanecem inalterados, e estes valores não vão além dos limites desta função. Então, o que eles fazem?

Sem mencionar que o laço de incremento não pode ser um número real, ele tem que ser um contador, um inteiro. Mas você define o valor do lote como um contador e subtrai um dele a cada iteração. Este é um grande erro, um erro muito grave.

Esclareça primeiro a lógica em sua mente e depois tente implementá-la em seu código.

 
bog_v_nas:

Mas aqui estão os avisos. Eu não consigo entender o que ele não gosta(


possível perda de dados devido à conversão do tipo Bolinger_Bands_traider.mq4 51 24
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 76 35
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 76 227
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 77 43
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 78 43
conversão implícita de 'string' para 'número' Bolinger_Bands_traider.mq4 85 71
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 93 23
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 93 91
conversão implícita de 'string' para 'número' Bolinger_Bands_traider.mq4 99 72
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 107 23
conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 107 91
0 erro(s), 11 advertência(ões), tempo de compilação: 204 msec 1 12

Saída de uma linha com o número 51, pois aqui não há contagem para entender o erro"possível perda de dados devido à conversão do tipo Bolinger_Bands_traider.mq4 51 24".

O resto: "conversão implícita de 'número' para 'string' Bolinger_Bands_traider.mq4 107 91

traduzir valores numéricos em uma cadeia de texto onde criamos o objeto - uma cadeia de texto, por exemplo

período()

deveria ser

DoubleToString(Período(),0)

 
Renat Akhtyamov:

traduzir os valores numéricos para uma cadeia de texto onde criamos um objeto de cadeia de texto, por exemplo

período()

deveria ser

DoubleToString(Período(),0)


Desde quando o período é um tipo duplo?
Razão: