[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 389

 
snail09_1:
É difícil de verificar, ou preguiçoso? É mais fácil fazer a pergunta. O preço da licitação pode ser zero? Ela pode, se nada for vendido8-(
não é a questão se o terminal pode reiniciar a licitação em algum momento (a experiência pessoal é interessante)
 
YOUNGA:
Não se trata de saber se o terminal pode reiniciar a licitação em algum momento (a experiência pessoal é de interesse).

Eu nunca vi nenhum. Você já viu zero absoluto no termômetro?

Bem, esse não pode ser o problema. Talvez você não tenha ninguém com quem conversar?

 
snail09_1:
Da mesma forma. Descubra este script e seu script sairá ainda melhor, e você poderá até mesmo acrescentar funcionalidades extras.


Eu não entendo bem como escrever um .dll

se entendi corretamente, a base do roteiro está neste arquivo.

 
Gente! No testador de estratégia sobre o histórico, o Consultor Especialista não alimenta o arquivo com informações, apenas quando se trata de comércio on-line. Qual é a razão e como posso consertá-la? Não tenho a menor idéia de como curá-lo. Obrigado.
 
net:
Gente! No testador de estratégia sobre o histórico, o Consultor Especialista não alimenta o arquivo com informações, apenas quando se trata de comércio on-line. Qual é a razão e como posso consertá-la? Não tenho a menor idéia de como curá-lo. Obrigado.
Ele só salva para o diretório de arquivos de especialistas do MetaTrader 4
 
Snegovik:


Eu não entendo bem como escrever um .dll

Se entendi corretamente, a base do roteiro está neste arquivo.


O script No 1 pode enviar um pedido ao servidor para abrir vários pedidos ao mesmo tempo. Você tem que abrir um de cada vez. A DLL oferecida a você simplesmente cria uma janela visual e funciona com ela. As ferramentas MQL4 podem ser suficientes para sua tarefa
 

Aqui está minha função de cálculo do lote (martin):

double Lots()
 {
 //  double LotsArray[]={mode_1,mode_2,mode_3,mode_4,mode_5,mode_6};
 //  double LotsArray[]= {0.1,0.2,0.3,0.4,0.5,0.6};
   int LossCount = 0;
   double LotM=Lot;
   int total = OrdersHistoryTotal();
   for (int i = total-1; i >= 0; i--)
    {
      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
       {
         if (OrderProfit() > 0)
          {
            LotM=LotsArray[0];
          }         
          else
           {
            LotM=LotsArray[LossCount+1];
            LossCount++;
           }
       }
    }
   return(LotM);
}

Estas são as variáveis globais para esta função:

double Lot = 0.1;
extern double mode_1 = 0.1;
extern double mode_2 = 0.2;
extern double mode_3 = 0.4;
extern double mode_4 = 0.8;
extern double mode_5 = 1.6;
extern double mode_6 = 3.2;
double LotsArray[5];

Aqui está o que no int init()

 LotsArray[0] = mode_1;
 LotsArray[1] = mode_2;
 LotsArray[2] = mode_3;
 LotsArray[3] = mode_4;
 LotsArray[4] = mode_5;
 LotsArray[5] = mode_6;

Ao testar o Expert Advisor, os seguintes erros são exibidos no registro do Expert Advisor:

2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: ERROR BUYSTOP : 1.22443 SL:1.22377 TP:1.22506
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: OrderSend error 4051
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: invalid lots amount for OrderSend function
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: Bid:1.22432 Ask:1.22438 avgSpread:0.00006  Commission rate:0.00003  Real avg. spread:0.00009  Lots:1.00   HIGH SPEED   MAX
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: 2012.07.19 16:19 tick:514
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: ERROR BUYSTOP : 1.22442 SL:1.22376 TP:1.22505
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: OrderSend error 4051
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: invalid lots amount for OrderSend function
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: Bid:1.22431 Ask:1.22437 avgSpread:0.00006  Commission rate:0.00003  Real avg. spread:0.00009  Lots:1.00   HIGH SPEED   MAX
2012.09.19 23:14:22     2012.07.19 16:19  mmm2.1.1~ EURUSD.5,M5: 2012.07.19 16:19 tick:513

Há algo errado com o código? O que isso pode significar?

Aqui https://docs.mql4.com/ru/runtime/errors vejo que isto é um erro:

ERR_INVALID_FUNCTION_PARAMVALUE (4051)

Isto é, o erro é devido a parâmetros errados. Como eu entendi o lote errado. Mas eu não entendo o que está errado aqui.

 
hoz:

Aqui está minha função de cálculo do lote (martin):

Estas são as variáveis globais para esta função:

Aqui está o que no int init()

Ao testar o Expert Advisor, os seguintes erros são exibidos no registro do Expert Advisor:

Há algo errado com o código? O que isso pode significar?

Aqui https://docs.mql4.com/ru/runtime/errors vejo que isto é um erro:

ERR_INVALID_FUNCTION_PARAMVALUE (4051)

Isto é, o erro é devido a parâmetros errados. Como eu entendi o lote errado. Mas eu não entendo o que está errado aqui.


Lotes duplosArray[5]; 5 a 6 correto.
 
Olá! é possível modificar um pedido uma vez? estou atualmente modificando um pedido a cada tick! não acho que isso seja correto!...
 
Olá Profissionais, por favor, avisem! Como devo escrever no EA, para que quando uma aposta é cancelada, o EA faça uma nova aposta na direção oposta na mesma barra (como um "flip"). Estou testando com o modelo "quando um novo bar abre". Para o exemplo da EA:
//+------------------------------------------------------------------+
//|                                                      CrossMa.mq4 |
//|                      Copyright © 2005, George-on-Don             |
//|                                       http://www.forex.aaanet.ru |
//+------------------------------------------------------------------+
#include <stdlib.mqh>
#include <stderror.mqh>
 
#define MAGICMA  20050610
 
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriod       = 12;
extern double MovingShift        = 0;
extern double MovingPeriod1      = 4;
extern double AtrPer             = 6;
extern bool   SndMl              = True ;
//+------------------------------------------------------------------+
//| Расчет открытия позиции                                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Расчет оптимальной величины лота                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Проверка для открытия позиции с первым тиком нового бара.        |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   double Atr;
   int    res;
   string sHeaderLetter;
   string sBodyLetter;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
   Atr = iATR(NULL,0,AtrPer,0);
 //---- Условие продажи
   if(maf<mas && maf_p>=mas_p)  
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
       if (SndMl == True && res != -1) 
         {
         sHeaderLetter = "Operation SELL by" + Symbol()+"";
         sBodyLetter = "Order Sell by"+ Symbol() + " at " + DoubleToStr(Bid,4)+ ", and set stop/loss at " + DoubleToStr(Ask+Atr,4)+"";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
      return;
     }
//---- Условие покупки
   if(maf>mas && maf_p<=mas_p)  
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      if ( SndMl == True && res != -1)
      { 
      sHeaderLetter = "Operation BUY at" + Symbol()+"";
      sBodyLetter = "Order Buy at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and set stop/loss at " + DoubleToStr(Bid-Atr,4)+"";
      sndMessage(sHeaderLetter, sBodyLetter);
      }
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| ПРоверка для закрытия открытой позиции                           |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double mas;
   double maf;
   double mas_p;
   double maf_p;
   string sHeaderLetter;
   string sBodyLetter;
   bool rtvl;
//---- 
   if(Volume[0]>1) return;
//----  
   mas=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1); // динный мувинг 12
   maf=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,1);// короткий мувинг 4
   mas_p=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2); // динный мувинг 12
   maf_p=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,2);// короткий мувинг 4
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //----  
      if(OrderType()==OP_BUY)
        {
         if(maf<mas && maf_p>=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
            if ( SndMl == True && rtvl != False )
            {
            sHeaderLetter = "Operation CLOSE BUY at" + Symbol()+"";
            sBodyLetter = "Close order Buy at"+ Symbol() + " for " + DoubleToStr(Bid,4)+ ", and finish this Trade";
            sndMessage(sHeaderLetter, sBodyLetter);
            }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(maf>mas && maf_p<=mas_p) rtvl=OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
         if ( SndMl == True && rtvl != False ) 
         {
         sHeaderLetter = "Operation CLOSE SELL at" + Symbol()+"";
         sBodyLetter = "Close order Sell at"+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and finish this Trade";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
         break;
        }
     }
//----
  }
  
//--------------------------------------------------------------------
// функция отправки ссобщения об отрытии или закрытии позиции
//--------------------------------------------------------------------
void sndMessage(string HeaderLetter, string BodyLetter)
{
   int RetVal;
   SendMail( HeaderLetter, BodyLetter );
   RetVal = GetLastError();
   if (RetVal!= ERR_NO_MQLERROR) Print ("Ошибка, сообщение не отправлено: ", ErrorDescription(RetVal));
}
//+------------------------------------------------------------------+
//| Майн функция                                                     |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars<25 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
Obrigado!