Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1130
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Hola a todos, seguimos perfeccionando lo que ya tenemos
Tenemos una cuadrícula irregular de órdenes y una línea horizontal que puede estar en cualquier lugar
Tenemos que ponerlo en práctica:
si el precio está por debajo de la línea cerrar todas las órdenes
Las dificultades son las siguientes
1) si las órdenes son de tipo no uniforme y ya al poner la línea está todo hecho, y no cuando ponemos el marcado y ponemos la línea (en este caso deberíamos poner también la bandera on/off)
2) Implementación de una inscripción en la parte superior derecha de la línea por tipo (si la orden se cierra a este precio, el resultado será el mismo para el saldo, es decir, tenemos que cambiar la visualización cada tick y también al mover la línea; es generalmente similar a un trailing stop o sl si la orden se coloca manualmente, sólo que flotante y con la posibilidad de disparos erróneos inicialmente)
El robot está ahí, salvo la etiqueta numérica todo está ya dibujado, la cuestión está en la correcta asignación de valores y el tratamiento de la información de toda la parrilla.
Mira esto, tal vez te sirva.
Hola. No entiendo por qué iTime a veces da la hora equivocada. La apertura de una nueva velaPERIOD_H1 debe mostrar la hora en el registro Print(iTime(NULL,PERIOD_M1,30)). En las pruebas muestra todo correctamente, pero en la realidad la hora es a veces diferente incluso por varias horas. ¿Por qué es así?
UtilizaCopyTime, yo también noté este problema al construir objetos gráficos yCopyTime solucionó el problema
if(CopyTime(Symbol(),Period(),0,1,TM)<0) return;
TIME0=TM[0];
Me preguntaba si se podría poner RefreshRates(). ¿Tal vez también ayude?
No lo probé, apliqué de inmediato una solución universal normal y me olvidé del problema.
Sí, eso es más o menos lo que necesito, ahora sólo tengo que averiguar cómo actualizar a 4.
//| TralingLine.mq4 |
//| Copyright © 2010, Viktorov |
//| v4forex@qip.ru |
//*******************************************************************|
#property copyright "Copyright © 2010, Viktorov"
#property link "v4forex@qip.ru"
extern int StopLevel = 7;
extern color ColorLine = IndianRed;
extern bool comment = false;
double prbuys, prsels, TICKVALUE, FixProfitBuy, FixProfitSel;
int Buy, Sel;
//****************expert initialization function*********************|
bool run = True,
Error = False;
int slip = 3;
double point,
STOPLEVEL;
int init()
{
point = Point;
if((Digits == 3 || Digits == 5))
{
point = Point*10;
slip *= 10;
}
run = True;
Error = False;
TICKVALUE = MarketInfo(Symbol(), MODE_TICKVALUE);
return(0);
}//******************************************************************|
double nd(double v){return(NormalizeDouble(v,Digits));}
string dts(double v){return(DoubleToStr(v, Digits));}
string dts2(double v){return(DoubleToStr(v, 2));}
string ttss(int v){return(TimeToStr(v,TIME_SECONDS));}
//*******************************************************************|
//| expert start function |
//*******************************************************************|
int start()
{
double nprbuys, nprsels;
CountTrades();
if(Buy > 0 && ObjectFind("StopBuy") == -1) drawline(OP_BUY);
if(Sel > 0 && ObjectFind("StopSel") == -1) drawline(OP_SELL);
if(ObjectFind("StopBuy") != -1)
nprbuys = ObjectGetValueByShift("StopBuy", 0);
if(ObjectFind("StopSel")!=-1)
nprsels = ObjectGetValueByShift("StopSel", 0);
if(nprbuys > 0 && Bid <= nprbuys)
{
CloseOrder(OP_BUY);
if(ObjectFind("StopBuy") != -1) ObjectDelete("StopBuy");
}
if(nprsels > 0 && Ask >= nprsels)
{
CloseOrder(OP_SELL);
if(ObjectFind("StopSel") != -1) ObjectDelete("StopSel");
}
FixProfit();
if(comment)
Comment("\n Текущее время ", ttss(TimeCurrent())
, "\n Ордера Buy закроются по цене ", dts(nprbuys), ". Фиксированная прибыль ", dts2(FixProfitBuy)
, "\n Ордера Sell закроются по цене ", dts(nprsels), ". Фиксированная прибыль ", dts2(FixProfitSel)
);
return(0);
}//******************************************************************|
//********************Подсчёт профита всех ордеров*******************|
void FixProfit()
{ double LineB, LineS, Profit, tv;
LineB = nd(ObjectGetValueByShift("StopBuy", 0));
LineS = nd(ObjectGetValueByShift("StopSel", 0));
tv = TICKVALUE; FixProfitBuy = 0; FixProfitSel = 0;
int Total = OrdersTotal();
for(int i = Total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY && LineB > 0)
{
if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineB;
FixProfitBuy += (OrderCommission() + OrderSwap() + (LineB - OrderOpenPrice())*tv*OrderLots()/Point);
}
if(OrderType() == OP_SELL && LineS > 0)
{
if(StringSubstr(Symbol(),0,3) == "USD") tv = TICKVALUE*Bid/LineS;
FixProfitSel += (OrderCommission() + OrderSwap() + (OrderOpenPrice() - LineS)*tv*OrderLots()/Point);
}
}
Profit += OrderProfit();
}
}
}//******************************************************************|
//*******Подсчёт открытых ордеров OP_BUY & OP_BUYSTOP****************|
void CountTrades()
{ Buy = 0; Sel = 0;
int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY) Buy++;
if(OrderType() == OP_SELL) Sel++;
}
}
}//for
}//*******************************************************|
//**********************рисование линий******************************|
void drawline(int sig)
{
double Otstup_ = StopLevel*point;
if(sig == OP_BUY)
{
prbuys = nd(iLow(NULL, 0, 1)-Otstup_);
ObjectCreate("StopBuy", OBJ_TREND, 0, Time[0]+2*Period()*60, prbuys, Time[0]+4*Period()*60, prbuys);
ObjectSet("StopBuy", OBJPROP_COLOR, ColorLine);
ObjectSet("StopBuy", OBJPROP_STYLE, STYLE_DOT);
}
if(sig == OP_SELL)
{
prsels = nd(iHigh(NULL, 0, 1)+Otstup_);
ObjectCreate("StopSel", OBJ_TREND, 0, Time[0]+2*Period()*60, prsels, Time[0]+4*Period()*60, prsels);
ObjectSet("StopSel", OBJPROP_COLOR, ColorLine);
ObjectSet("StopSel", OBJPROP_STYLE, STYLE_DOT);
}
return;
}//******************************************************************|
//********************Закрытие ордеров*******************************|
void CloseOrder(int sig)
{ double GH, FE, c = 0; bool OrdClose; int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
OrdClose = False;
if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol())
{
if(OrderType() == sig)
{
while(!OrdClose) // Цикл закрытия ордера 8 попыток
{
RefreshRates();
if(OrderType() == OP_BUY) GH = Bid;
else if(OrderType() == OP_SELL) GH = Ask;
OrdClose = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(GH, Digits), slip, CLR_NONE);
if(OrdClose) i--;
if(!OrdClose)
{
FE = Fun_Error(GetLastError());
if(FE == 1) { continue; } // Повторная попытка
else if(FE == 0) { Print("Неудачная попытка CloseOrder Error = ", GetLastError()); return;}
else { Print("Неудачная попытка CloseOrder"); return; }
}
} // Цикл while(c < 8)
}
}
}//for
return;
}//******************************************************************|
//*********************Ф-ия обработки ошибок*************************|
int Fun_Error(int error)
{
switch(error)
{ // Преодолимые ошибки
case 0: return(1);
case 4: //Print("Торговый сервер занят. Пробуем ещё раз...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 128: //Истек срок ожидания совершения сделки
return(1);
case 6: //Print("Нет связи с торговым сервером. Пробуем ещё раз...");
Sleep(10000); // Простое решение
return(1); // Выход из функции
case 129: //Print("Цена изменилась. Пробуем ещё раз...");
return(1); // Выход из функции
case 132: //Print("Рынок закрыт. Пробуем ещё раз...");
Sleep(123000); // Простое решение
return(1); // Выход из функции
case 135: //Print("Цена изменилась. Пробуем ещё раз...");
RefreshRates(); // Обновим данные
return(1); // Выход из функции
case 136: //Print("Нет цен. Ждём новый тик...");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 137: //Print("Брокер занят. Пробуем ещё раз...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 138: //Print("Новые цены. Пробуем ещё раз...");
Sleep(1); // Задержка в цикле
return(1); // Выход из функции
case 146: //Print("Подсистема торговли занята. Пробуем ещё...");
Sleep(500); // Простое решение
return(1); // Выход из функции
case 4107: //Print("Неправильный параметр цены для торговой функции. Пробуем ещё...");
Sleep(50); // Простое решение
return(1); // Выход из функции
// Критические ошибки
case 1:
return(0);
case 2: Alert("Общая ошибка. Перегрузите терминал и\или компьютер.");
return(0); // Выход из функции
case 5: Alert("Старая версия терминала.");
//Work=false; // Больше не работать
return(0); // Выход из функции
case 64: Alert("Счет заблокирован.");
//Work=false; // Больше не работать
return(0); // Выход из функции
case 130: //Alert("Неправильные стопы.");
return(0); // Выход из функции
case 133: Alert("Торговля запрещена.");
return(0); // Выход из функции
case 134: Alert("Недостаточно денег для совершения операции.");
return(0); // Выход из функции
case 4051: Alert("Недопустимое значение параметра функции.");
return(0); // Выход из функции
case 4108: Alert("Неверный номер тикета.");
return(0); // Выход из функции
default: //Print("Возникла ошибка ",Error); // Другие варианты
return(0); // Выход из функции
}
}//******************************************************************|
//****************expert deinitialization function*******************|
int deinit()
{
ObjectDelete("StopBuy");
ObjectDelete("StopSel");
return(0);
}//******************************************************************|
Bien, por el interés voy a hacer en un terminal con RefreshRates() y en el otro con CopyTime.
El problema del desfase horario se ha mostrado bien en el probador, por lo que RefreshRates podría no ayudar.
1. ¿Existe alguna herramienta práctica para sincronizar Asesores Expertos, indicadores y scripts entre terminales? (por ejemplo, programo en un terminal, luego necesito enviar el Asesor Experto a los terminales en los que opero)
2. ¿Hay algún ejemplo de actualización automática (carga de una nueva versión) de un EA en un gráfico de trabajo?