Este método de cálculo de swap é chamado de rollover. Não se pode saber programticamente em MT4. Somente indiretamente após a troca da meia-noite das ordens do mercado de trabalho. Existem muitos problemas tão pequenos, mas bastante desagradáveis, no MT4. Na MT5 há um pouco menos, mas eles ainda existem.
Estes são os valores de troca em pips. Eles devem ser convertidos na moeda do depósito, com base no volume da ordem do mercado. Então, será obtido o tamanho real da troca.
"Não há como descobrir programmaticamente no MT4". - Obrigado por seu tempo e por suas respostas.
Boa tarde! Caros usuários do fórum, por favor, ajudem-me a entender o algoritmo. O objetivo é determinar a faixa de preço no período de tempo especificado e definir as paradas de compra e venda no máximo e no mínimo. Os Stoplosses são estabelecidos em ordens opostas, TakeProfit deve ser igual a StopLoss*2.
Então, após cada fechamento por Stop Loss, a ordem é restaurada com o mesmo Stop Loss e Take Profit que a fechada e todo o ciclo é completado uma vez que uma das ordens é fechada por Take Profit. E tudo desde o início nós definimos o alcance e vamos.
Mas agora ele simplesmente não coloca o TP ou melhor, ele o coloca ao preço aberto e parar a perda não está no tamanho da faixa, ou seja, não está em uma ordem contrária dirigida. Agradecemos antecipadamente pela ajuda.
staticint prevtime = 0;
int MagicNumber = 12345678;
inputint stoploss = 40;
inputint takeprofit = 50;
inputint padding = 5;
int a=1;
inputstring startTime = "14:35";
inputstring endTime = "18:35";
int expertBars;
double max, min;
bool isEndTime = true;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//sendOrders();return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+#include <expert.mq4>
int start()
{
//Возвращает максимум и минимум за промежутокif(isTime()) getMaxMin();
// всё, что задается ниже - будет работать по "ценам открытия"//нового бара, т.е. будет срабатывать в момент его появления//на том графике, на кот. стоит советник
CheckEvents( MagicNumber );
if ( eventBuyClosed_SL > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по СтопЛоссу!" );
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Минимальный стоп левел: ", minstoplevel);
OrderSend(_Symbol,OP_BUYSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrGreen);
}
if ( eventBuyClosed_TP > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Buy-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventSellClosed_SL > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по СтопЛоссу!" );
double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Минимальный стоп левел: ", minstoplevel);
OrderSend(_Symbol,OP_SELLSTOP,OrderLots(),OrderOpenPrice(),3,OrderStopLoss(),OrderTakeProfit(),"My order",MagicNumber,0,clrRed);
}
if ( eventSellClosed_TP > 0 ) {
Alert( _Symbol, OrderClosePrice(), ": Sell-позиция закрыта по ТейкПрофиту!" );
deleteAllPaddingOrders();
}
if ( eventBuyLimitOpened > 0 || eventBuyStopOpened > 0 ||
eventSellLimitOpened > 0 || eventSellStopOpened > 0 )
Alert( _Symbol, OrderType(), ": сработал отложенный ордер!" );
return(0);
}
//-----------------------------------------------------------------+void deleteAllPaddingOrders() {
int total = OrdersTotal();
for(int i=total-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS);
int type = OrderType();
if (OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() != _Symbol) continue;
bool result = false;
switch(type)
{
//Close opened long positionscaseOP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
break;
//Close opened short positionscaseOP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
// break;//Close pending orders//case OP_BUYLIMIT ://case OP_SELLLIMIT :caseOP_BUYSTOP :
caseOP_SELLSTOP : result = OrderDelete( OrderTicket() );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
return;
}
return;
}
void sendOrders(bool isFirst) {
//--- получим минимальное значение Stop leveldouble minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
Print("Minimum Stop Level=",minstoplevel," points");
//--- BUYSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаint ticketBuyStop, ticketSellStop;
if(!isFirst) {
ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,Ask + padding * Point,20,Bid -padding*Point,Ask + padding * Point,"My order",MagicNumber,0,clrGreen);
ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,Bid - padding * Point,20,Ask + padding*Point,Bid - padding * Point,"My order",MagicNumber,0,clrRed);
} else {
ticketBuyStop=OrderSend(Symbol(),OP_BUYSTOP,1,max + padding * Point,20,min -padding*Point,max + (max - min + padding) * Point,"My order",MagicNumber,0,clrGreen);
ticketSellStop=OrderSend(Symbol(),OP_SELLSTOP,1,min - padding * Point,20,max + padding*Point,min - (max - min + padding)*Point,"My order",MagicNumber,0,clrRed);
}
if(ticketBuyStop<0)
{
Print("OrderSend завершилась с ошибкой #",GetLastError());
deleteAllPaddingOrders();
if(a <=5) {
//sendOrders(isFirst);
a= a+1;
}
}
elsePrint("Функция OrderSend успешно выполнена");
//---BUYSTOP//---SELLSTOP//--- вычисленные значения цен SL и TP должны быть нормализованы//--- размещаем рыночный ордер на покупку 1 лотаif(ticketSellStop<0)
{
deleteAllPaddingOrders();
if(a <= 5) {
//sendOrders();
a= a+1;
Print("a", a);
}
Print("OrderSend завершилась с ошибкой #",GetLastError());
}
elsePrint("Функция OrderSend успешно выполнена");
//---SELLSTOPreturn;
}
bool getMaxMin() {
int startIndex = iBarShift(_Symbol, 0, StrToTime(startTime), true);
min=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,startIndex,0));
max=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,startIndex,0));
Alert("Min: ", min);
Alert("Max: ", max);
sendOrders(true);
returntrue;
}
//===============================================================================+//======| возвращает true если временной диапозон кончился |//===============================================================================+bool isTime() {
if (TimeHour(StrToTime(startTime)) == Hour() && TimeMinute(StrToTime(startTime)) == Minute() && isEndTime) { Alert("Start Timeline"); isEndTime = false; deleteAllPaddingOrders();};
if(TimeHour(StrToTime(endTime)) == Hour() && TimeMinute(StrToTime(endTime)) <= Minute() && !isEndTime) { Alert("End Timeline"); isEndTime = true; returntrue;};
returnfalse;
}
//=====================================================================+//======| возвращает true если появился новый бар, иначе false |//=====================================================================+//bool isNewBar()//{//bool res=false;//if(expertBars!=iBars(Symbol(),0))//{//expertBars=iBars( Symbol (),0);//res=true;//}//return(res);//}
Ao testar no registro recebo OrderSend error 130 - se entendi corretamente só pode ser relacionado a paradas ou golpes, por favor, verifique o que está errado:
#define MagicNumber1 100//Buyinputdouble MaximumRisk=0.03; //Max риск в сделке
input double K=1; //Коэффициент риск к прибыли
inputint OrderPoint=30; //Расстояние до отложенного ордераdouble Price=0; //Цена для установки отложенного ордераdouble SL=0; //Stop Lossdouble TP=0; //Take Profitdouble Lots=0; //Просчет лотности исходя из max риска одной сделкиvoidOnTick()
{
//Параметры для открытия ордера
Price = NormalizeDouble(High[1]+OrderPoint*Point,Digits); //Цена открытия ордера
SL = NormalizeDouble(Low[1]-Point,Digits); //Стоп лоссif ((Price-SL)<NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
{SL=Price-NormalizeDouble(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);}
TP = NormalizeDouble((Price-SL)*K+Price,Digits); //Тэйк профит//Просчет лотности исходя из риска в сделке
Lots = NormalizeDouble(((AccountBalance()*MaximumRisk/100.0)/((Price-SL)*1000.0)),1);
//Установка отложенного ордераbool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,"comment",MagicNumber1,0,clrGreen);
}
Ao testar no registro há um erro OrderSend error 130 - se eu entendi corretamente só pode ser relacionado a paradas ou golpes,
Os preços abertos de pedidos pendentes também são afetados. É por isso que precisamos verificar a distância entre o preço atual de mercado e o preço aberto da ordem. Neste caso: Preço - Pergunte.
O preço de abertura das ordens pendentes também se aplica. Portanto, devemos também verificar a distância entre o preço atual de mercado e o preço de abertura da ordem. Neste caso: Preço - Pergunte.
É um pouco complicado para mim. Você poderia explicar em que parte do código acrescentar e o que significa mn e mag_n? onde devo colocar meu medjic EA aqui?
Este método de cálculo de swap é chamado de rollover. Não se pode saber programticamente em MT4. Somente indiretamente após a troca da meia-noite das ordens do mercado de trabalho. Existem muitos problemas tão pequenos, mas bastante desagradáveis, no MT4. Na MT5 há um pouco menos, mas eles ainda existem.
Estes são os valores de troca em pips. Eles devem ser convertidos na moeda do depósito, com base no volume da ordem do mercado. Então, será obtido o tamanho real da troca.
"Não há como descobrir programmaticamente no MT4". - Obrigado por seu tempo e por suas respostas.
Boa tarde! Caros usuários do fórum, por favor, ajudem-me a entender o algoritmo. O objetivo é determinar a faixa de preço no período de tempo especificado e definir as paradas de compra e venda no máximo e no mínimo. Os Stoplosses são estabelecidos em ordens opostas, TakeProfit deve ser igual a StopLoss*2.
Então, após cada fechamento por Stop Loss, a ordem é restaurada com o mesmo Stop Loss e Take Profit que a fechada e todo o ciclo é completado uma vez que uma das ordens é fechada por Take Profit. E tudo desde o início nós definimos o alcance e vamos.
Mas agora ele simplesmente não coloca o TP ou melhor, ele o coloca ao preço aberto e parar a perda não está no tamanho da faixa, ou seja, não está em uma ordem contrária dirigida. Agradecemos antecipadamente pela ajuda.
Não há necessidade de duplicar as perguntas em diferentes tópicos.
Boa tarde!
Ao testar no registro recebo OrderSend error 130 - se entendi corretamente só pode ser relacionado a paradas ou golpes, por favor, verifique o que está errado:
Boa tarde!
Ao testar no registro há um erro OrderSend error 130 - se eu entendi corretamente só pode ser relacionado a paradas ou golpes,
Os preços abertos de pedidos pendentes também são afetados. É por isso que precisamos verificar a distância entre o preço atual de mercado e o preço aberto da ordem. Neste caso: Preço - Pergunte.
O preço de abertura das ordens pendentes também se aplica. Portanto, devemos também verificar a distância entre o preço atual de mercado e o preço de abertura da ordem. Neste caso: Preço - Pergunte.
O que a função Hora() retorna?
Retorna a hora atual. é assim que eu trabalho: se a hora atual for maior que 11 e menor que 17,
mas como?
É um pouco complicado para mim. Você poderia explicar em que parte do código acrescentar e o que significa mn e mag_n? onde devo colocar meu medjic EA aqui?
Antes de sua condição colocar
mag_n - onde eu coloco aqui o IG do meu EA?
Estou escrevendo: se a hora atual é mais de 11 e menos de 17, como deve ser?
Entendo que a questão é sobre o indicador. Ao invés deHora() -> tempo[i]
Entendo que a pergunta é sobre o indicador. Ao invés deHora() -> tempo[i].
Sim, você ajudou, agora eu quero limitar o tempo. Excluir a contagem das 17h às 23h.