Este método de cálculo del swap se denomina rollover. No se puede saber de forma programada en MT4. Sólo indirectamente después del cambio de medianoche de las órdenes de mercado de trabajo. Hay muchos de estos pequeños, pero bastante desagradables problemas en MT4. En MT5 hay un poco menos, pero siguen existiendo.
Estos son los valores del swap en pips. Deben convertirse a la moneda del depósito, en función del volumen de la orden de mercado. Entonces obtendrá el tamaño real del intercambio.
"No hay forma de averiguarlo programáticamente en MT4". - Gracias por su tiempo y sus respuestas.
Buenas tardes! Estimados usuarios del foro, por favor ayúdenme a entender el algoritmo. El objetivo es determinar el rango de precios en el período de tiempo especificado y establecer las paradas de compra y venta en el máximo y el mínimo. Los Stoploss se establecen en órdenes opuestas, TakeProfit debe ser igual a StopLoss*2.
Luego, después de cada cierre por Stop Loss, la orden se restablece con el mismo Stop Loss y Take Profit que la cerrada y todo el ciclo se completa una vez que una de las órdenes se cierra por Take Profit. Y todo desde el principio definimos la gama y vamos.
Pero ahora simplemente no coloca TP o más bien lo coloca en el precio de apertura y el stop loss no está en el tamaño del rango, es decir, no en una orden dirigida en sentido contrario. Le agradezco de antemano su ayuda.
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);//}
Al probar en el registro me sale el error OrderSend 130 - si entiendo bien sólo puede estar relacionado con los topes o golpes, por favor, compruebe lo que está mal:
#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);
}
Al probar en el registro hay un error OrderSend error 130 - si entiendo correctamente sólo puede estar relacionado con paradas o golpes,
Los precios abiertos de las órdenes pendientes también se ven afectados. Por eso hay que comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.
También se aplica el precio de apertura de las órdenes pendientes. Por lo tanto, también debemos comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.
Este método de cálculo del swap se denomina rollover. No se puede saber de forma programada en MT4. Sólo indirectamente después del cambio de medianoche de las órdenes de mercado de trabajo. Hay muchos de estos pequeños, pero bastante desagradables problemas en MT4. En MT5 hay un poco menos, pero siguen existiendo.
Estos son los valores del swap en pips. Deben convertirse a la moneda del depósito, en función del volumen de la orden de mercado. Entonces obtendrá el tamaño real del intercambio.
"No hay forma de averiguarlo programáticamente en MT4". - Gracias por su tiempo y sus respuestas.
Buenas tardes! Estimados usuarios del foro, por favor ayúdenme a entender el algoritmo. El objetivo es determinar el rango de precios en el período de tiempo especificado y establecer las paradas de compra y venta en el máximo y el mínimo. Los Stoploss se establecen en órdenes opuestas, TakeProfit debe ser igual a StopLoss*2.
Luego, después de cada cierre por Stop Loss, la orden se restablece con el mismo Stop Loss y Take Profit que la cerrada y todo el ciclo se completa una vez que una de las órdenes se cierra por Take Profit. Y todo desde el principio definimos la gama y vamos.
Pero ahora simplemente no coloca TP o más bien lo coloca en el precio de apertura y el stop loss no está en el tamaño del rango, es decir, no en una orden dirigida en sentido contrario. Le agradezco de antemano su ayuda.
No es necesario duplicar las preguntas en diferentes hilos.
¡Buenas tardes!
Al probar en el registro me sale el error OrderSend 130 - si entiendo bien sólo puede estar relacionado con los topes o golpes, por favor, compruebe lo que está mal:
¡Buenas tardes!
Al probar en el registro hay un error OrderSend error 130 - si entiendo correctamente sólo puede estar relacionado con paradas o golpes,
Los precios abiertos de las órdenes pendientes también se ven afectados. Por eso hay que comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.
También se aplica el precio de apertura de las órdenes pendientes. Por lo tanto, también debemos comprobar la distancia entre el precio actual del mercado y el precio de apertura de la orden. En este caso: Precio - Pregunta.
¿Qué devuelve la función Hour()?
Devuelve la hora actual. Así es como trabajo: si la hora actual es mayor que 11 y menor que 17,
¿pero cómo?
Es un poco complicado para mí. ¿Podría explicar en qué parte del código para agregar y qué significa mn y mag_n? ¿dónde debo poner mi EA medjic aquí?
Antes de que su estado ponga
mag_n - ¿dónde pongo el IG de mi EA aquí?
Escribo: si la hora actual es más de las 11 y menos de las 17, ¿cómo debería ser?
Entiendo que la pregunta es sobre el indicador. En lugar deHour() -> time[i]
Entiendo que la pregunta es sobre el indicador. En lugar deHour() -> time[i].
Sí, me has ayudado, ahora quiero limitar el tiempo. Excluye el cómputo de las 17 a las 23 horas.