Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 32
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Aí está, isso é diferente, agora está claro o que é o 1% em relação a ;)
O Expert Advisor considera os valores mínimos e máximos dos últimos X bares e faz pedidos por eles. Então, quando o máximo ou mínimo é diminuído, você deve apagar o pedido correspondente e abrir com novos dados.
Não entendeu exatamente quando você modificou as pausas, mas fez com que, se o preço mínimo for mais alto do que o preço de ajuste do BuyLimit existente, então você precisa modificá-lo para o novo preço mínimo.
Para SellLimit - espelhado.
Eu apenas escrevi o código, mas não o verifiquei de forma alguma - deixo para vocês modificarem e verificarem a correção do algoritmo e do código em geral.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0, minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- если нету рыночных Buy
if(getData.buy==0) {
//--- если нет отложенного BuyLimit
if(getData.order.buy_limit.number==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
ResetLastError();
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
else Print("OP_BUYLIMIT OK");
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if(minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if(getData.sell==0) {
//--- если нет отложенного SellLimit
if(getData.order.sell_limit.number==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
ResetLastError();
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
else Print("OP_SELLLIMIT OK");
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if(maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
ZeroMemory(data_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
//--- рыночные позиции
if(OrderType()==OP_BUY) data_of.buy++;
if(OrderType()==OP_SELL) data_of.sell++;
//--- отложенные ордера
if(OrderType()==OP_BUYLIMIT) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_BUYSTOP) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLLIMIT) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLSTOP) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set=OrderOpenPrice(); }
}
}
}
//+------------------------------------------------------------------+
Espero que você descubra
Por que excluir quando você pode modificar o preço de ajuste e parar e retirar em relação ao novo nível?
Comecei agora mesmo a estudar e a opção de exclusão era estudar a aplicação da função, eu me perguntava por que não funcionava.
Obrigado a todos por seu feedback.
Alguém quer saber como deve ser o comando de reset externo?
como deve ser
1) Selecione da lista um conjunto de condições necessárias para o comando acionar, por exemplo, abrir uma ordem
2) A ordem é aberta e o comando não funciona sob nenhuma outra condição. A filtragem por bilhete e quantidade do pedido não é uma opção, uma vez que o princípio em si deve ser espalhado por toda a lista.
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) Qual é o erro aqui se GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] usar cruzamento móvel + filtro por distância após cruzamento móvel. Quão precisa é esta condição?
O queGrossMA1 eGrossMA2 lhe devolvem, provavelmente há uma diferença lá, você acaba com algo como isto
MA1= 1.0050
se (MA1 > 0,0052) // não é o preço em si, mas sua diferença, então não é uma comparação incorreta
O queGrossMA1 eGrossMA2 lhe devolvem, provavelmente há uma diferença lá, você acaba com algo como isto
MA1= 1.0050
se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta
O queGrossMA1 eGrossMA2 lhe devolvem, muito provavelmente há uma diferença, você acaba com algo como isto
MA1= 1.0050
se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta
FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);
FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);
GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
O queGrossMA1 eGrossMA2 lhe devolvem, muito provavelmente há uma diferença, você acaba com algo como isto
MA1= 1.0050
se (MA1 > 0,0052) // isto é, não o preço em si, mas sua diferença, então é uma comparação incorreta
Bom. Você pode me dizer onde está o erro?
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Tudo funciona, coloca um pedido ao preço de maxpr1.
Então eu quero fazer o mesmo, mas a um preço minpr1:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double minpr1=9999;
for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}
for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Erro 130 (paradas erradas). O que eu estou fazendo de errado?