[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 449
No, sólo significa que los datos coinciden con una parte de la historia.
Podría haberlo introducido manualmente, por ejemplo. O bien se escribe desde un archivo de texto. O podrías haberlo obtenido de una calculadora.
Porque incluso introduciendo algún dato condicional "1,25 1,16 1,73 1,35" podemos obtener el historial de alguna moneda de hace muchos años. Pero eso no significa que hayamos establecido una serie temporal de arreglos
He retocado un poco el guión original:
1. He copiado en la matriz personalizada sólo 5 últimos precios de apertura.
2. Calculado el array personalizado obtenido por los 5 precios de apertura copiados.
/+------------------------------------------------------------------------------------------+
//| ArrayGetAsSeries_плюс.mq4 |//+------------------------------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------------------------------+//------------------------------------ НАЧАЛО START -------------------------------------- 1 -int start() //функция start
{ //начало startdouble Timestart=GetTickCount(); //переменная, с помощью которой вычисляется время (в милисекундах) начала выполнения эксперта double array1[]; //объявляем массив-приемник (массив, куда будут скопированы данные)int element=ArrayCopy(array1,Open,0,0,5); //копируем данные по максимальным ценам в пользовательский массив (начиная с 1-о бара, а не с нулевого)int size=ArraySize(array1); //устанавливаем количество элементов массива array1//----------------------------------------------------------------------------------------- 2 -Comment("\nФункция ArrayCopy(array1[],Open,0,0,WHOLE_ARRAY) вернула: ",element,
"\nФункция ArraySize(array1) вернула: ",size,
"\nЗначение цены открытия бара №0 равно ",array1[0],"; Время цены открытия бара №0: ",TimeToStr(iTime(NULL,0,0),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №1 равно ",array1[1],"; Время цены открытия бара №1: ",TimeToStr(iTime(NULL,0,1),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №2 равно ",array1[2],"; Время цены открытия бара №2: ",TimeToStr(iTime(NULL,0,2),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №3 равно ",array1[3],"; Время цены открытия бара №3: ",TimeToStr(iTime(NULL,0,3),TIME_DATE|TIME_MINUTES),
"\nЗначение цены открытия бара №4 равно ",array1[4],"; Время цены открытия бара №4: ",TimeToStr(iTime(NULL,0,4),TIME_DATE|TIME_MINUTES),
"\nФункция ArrayGetAsSeries(array1) вернула: ",ArrayGetAsSeries(array1),
"\nСкрипт выполнялся всего ",GetTickCount()-Timestart," миллисекунд, из них: ",MathFloor((GetTickCount()-Timestart)/1000),
" секунд ",((GetTickCount()-Timestart)/1000-MathFloor((GetTickCount()-Timestart)/1000))*1000," миллисекунд");//печать //сообщения на экран//----------------------------------------------------------------------------------------- 3 -return(0); //выход из start
} //конец start//-------------------------------------- КОНЕЦ START -------------------------------------- 4 -
Esto es lo que tengo:
Como se puede ver en la figura, los precios de apertura están indexados en orden inverso (como lo demuestra el NÚMERO de precios de apertura de la barra (va en orden ascendente) y la HORA de los precios de apertura de la barra (va en orden descendente)), es decir, la matriz está organizada como una matriz-serie de tiempo.
Pero la función ArrayGetAsSeries devuelve sin embargo 0 (falso), lo que significa: el array del usuario NO está organizado como un array-serie.
1. He copiado sólo los últimos 5 precios de apertura en un array personalizado.
2. Rasprocesó el array personalizado resultante por los 5 precios de apertura copiados.
Esto es lo que tengo:
Como se puede ver en la figura, los precios de apertura están indexados en orden inverso (como lo demuestra el NÚMERO de precios de apertura de la barra (va en orden ascendente) y la HORA de los precios de apertura de la barra (va en orden descendente)), es decir, la matriz está organizada como una matriz-serie de tiempo.
Pero la función ArrayGetAsSeries devuelve sin embargo 0 (falso), lo que significa: el array del usuario NO está organizado como un array-serie.
Por favor, aclare
Pregunta: ¿cómo explicarlo?
P.D. Gracias por responder a mis preguntas.
¿Ha intentado utilizar el
boolArraySetAsSeries(
void array[], bool set)
Establece la dirección de indexación de un array. Unconjunto TRUE establece la dirección de indexación en orden inverso, es decir, el último elemento tiene un índice cero. Un valor de FALSE establece la dirección de indexación normal. La función devuelve el estado anterior.
Establece la dirección de indexación del array. Un valor deset TRUE establece la dirección de indexación en orden inverso, es decir, el último elemento tiene un índice cero. Un valor de FALSE establece la dirección de indexación normal. La función devuelve el estado anterior.
Parámetros:
array[]
-
Arreglo numérico para establecer.
set
-
La dirección en la que se indexa el array.
Mi objetivo en esta etapa es entender cómo funciona una función en particular, y en este caso particular, cómo funciona la función ArrayGetAsSeries. Entiendo que puedo utilizar la función ArraySetAsSeries con el parámetro set=true, que establece forzosamente la indexación, como en array-timeseries. Pero quiero entender por qué en mi caso la función ArrayGetAsSeries devolvió 0, a pesar de que el array parece una serie temporal (es decir, está indexado como una serie temporal)
Bueno, tal vez hay algo mal con i_maShiftByPrice??
Es difícil ser más preciso.
La información que emite no es correcta. Aquí está el código completo:
#property copyright "hoz"#property link ""#include <stderror.mqh>#include <stdlib.mqh>externstring h1 = "основные параметры машки";
externint i_maTF = 0;
externint i_maPeriod = 50;
externint i_maShiftByPrice = 0;
externint i_maMethod = 0;
externint i_maPrice = 0;
externint i_shiftBarsBack1 = 1; // Первое значение shiftexternint i_shiftBarsBack2 = 49; // Второе значение shiftexternstring h2 = "===============================";
string h3 = "Значения цены и времени в точках А и В гипотенузы";
double price1, // Цена в точке А
price2, // Цена в точке В
time1, // Время в точке А
time2, // Время в точке Вstring h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double varsPrice1[100], // Буфер для цены в точке А
varsPrice2[100], // Буфер для цены в точке В
varsTime1[100], // Буфер для времени в точке А
varsTime2[100], // Буфер для времени в точке В#property indicator_separate_window#property indicator_buffers 5#property indicator_color1 Red//+------------------------------------------------------------------+//| Функция инициализации индикатора |//+------------------------------------------------------------------+int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexBuffer(0,varsAngle); // Связываем массив значений угла с буферомSetIndexStyle(0,DRAW_HISTOGRAM);
// -------------- блок инициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция деинициализации индикатора |//+------------------------------------------------------------------+int deinit()
{
// -------------- блок деинициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция итерации эксперта |//+------------------------------------------------------------------+int start()
{
int i, countedBars = IndicatorCounted();
int limit = Bars - countedBars;
if (limit > 100) limit = 100;
for(i = limit - 1;i > 0;i--)
{
price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i); // Цена в точке А
price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i); // Цена в точке В
time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1); // Время в точке А
time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1); // Время в точке ВPrint("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
string error = GetMyLastError2();
// Print("vars", DoubleToStr(price1,5));// Print("vars", DoubleToStr(varsPrice1[i],5));
varsPrice1[i] = price1; // Массив цен в точке А
varsPrice2[i] = price2; // Массив цен в точке В
varsTime1[i] = time1; // Массив времени в точке А
varsTime2[i] = time2; // Массив времени в точке В// Print("vars", DoubleToStr(varsPrice1[i],5));double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
// Print("d = ", d, " h = ", h);double angle = h/d;
varsAngle[i] = angle;
}
return(0);
}
string GetMyLastError2()
{
int err = GetLastError();
string serr = ErrorDescription(err);
return(serr);
}
/* //+------------------------------------------------------------------+
//| Функция рассчёта тангенса угла |
//+------------------------------------------------------------------+
double TanA(double d, double h)
{
double angle = h/d;
return(0);
}
// -------------- блок деинициализации закончен ---------------------- */
Me pregunto cómo has conseguido meter algo en el registro si el código que has presentado no compila.
Ah, si lo compilas, no tendrás ninguna rareza.
Siempre compilo normalmente.
He limpiado el código de impresoras y variables extra para no confundir a nadie. Pero no los he eliminado abajo, por lo que no ha compilado. Aquí está el código completo que compila:
//+------------------------------------------------------------------+//| AngleByTg.mq4 |//| hoz |//| |//+------------------------------------------------------------------+#property copyright "hoz"#property link ""#include <stderror.mqh>#include <stdlib.mqh>externstring h1 = "основные параметры машки";
externint i_maTF = 0;
externint i_maPeriod = 50;
externint i_maShiftByPrice = 0;
externint i_maMethod = 0;
externint i_maPrice = 0;
externint i_shiftBarsBack1 = 1; // Первое значение shiftexternint i_shiftBarsBack2 = 49; // Второе значение shiftexternstring h2 = "===============================";
string h3 = "Значения цены и времени в точках А и В гипотенузы";
double price1, // Цена в точке А
price2, // Цена в точке В
time1, // Время в точке А
time2, // Время в точке В
angle; // Значение возвращаемой тангенсомstring h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double varsPrice1[100], // Буфер для цены в точке А
varsPrice2[100], // Буфер для цены в точке В
varsTime1[100], // Буфер для времени в точке А
varsTime2[100], // Буфер для времени в точке В
varsAngle[100]; // Буфер для хранения значение угла#property indicator_separate_window#property indicator_buffers 5#property indicator_color1 Red//#property indicator_minimum -90//#property indicator_maximum 90//+------------------------------------------------------------------+//| Функция инициализации индикатора |//+------------------------------------------------------------------+int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
SetIndexBuffer(0,varsAngle); // Связываем массив значений угла с буферомSetIndexStyle(0,DRAW_HISTOGRAM);
// -------------- блок инициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция деинициализации индикатора |//+------------------------------------------------------------------+int deinit()
{
// -------------- блок деинициализации закончен ----------------------return(0);
}
//+------------------------------------------------------------------+//| Функция итерации эксперта |//+------------------------------------------------------------------+int start()
{
// if (!isNewBar())// return(0);int i, countedBars = IndicatorCounted();
int limit = Bars - countedBars;
if (limit > 100) limit = 100;
for(i = limit - 1;i > 0;i--)
{
price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i); // Цена в точке А
price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i); // Цена в точке В
time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1); // Время в точке А
time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1); // Время в точке ВPrint("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
string error = GetMyLastError2();
// Print("i = ", i," time1 = ", time1, " price1 = ", price1);// Print("vars", DoubleToStr(price1,5));// Print("vars", DoubleToStr(varsPrice1[i],5));
varsPrice1[i] = price1; // Массив цен в точке А
varsPrice2[i] = price2; // Массив цен в точке В
varsTime1[i] = time1; // Массив времени в точке А
varsTime2[i] = time2; // Массив времени в точке В// Print("vars", DoubleToStr(varsPrice1[i],5));//Print("i = ", i," time1 = ", time1, " price1 = ", price1);// Print("i = ", i," time2 = ", time2, " price2 = ", price2);// Print("i = ", i," varsTime1[i] = ", varsTime1[i], " varsPrice1[i] = ", varsPrice1[i]);// Print("i = ", i," varsTime2[i] = ", varsTime2[i], " varsPrice2[i] = ", varsPrice2[i]);double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
// Print("d = ", d, " h = ", h);double angle = h/d;
varsAngle[i] = angle;
// Print("i = ", i," varsAngle[i] = ", varsAngle[i]);
}
return(0);
}
string GetMyLastError2()
{
int err = GetLastError();
string serr = ErrorDescription(err);
return(serr);
}
/* //+------------------------------------------------------------------+
//| Функция рассчёта тангенса угла |
//+------------------------------------------------------------------+
double TanA(double d, double h)
{
double angle = h/d;
return(0);
}
// -------------- блок деинициализации закончен ---------------------- */
¡Por favor, ayuda! ¿Cómo hacer que un EA cierre una orden antigua al abrir una nueva? En el Probador de Estrategias funciona bien, pero en la cuenta real, por alguna razón, cuando abro una nueva, la antigua se va???????? Soy un cero total en programación(((
//---- input parameters //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_BUY=true; extern int SL_buy=62; //---входные параметры по лонгам extern int Risk_buy=0; //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_SELL=true; extern int SL_sell=62; //---входные параметры по шортам extern int Risk_sell=0; //ooooooooooooooooooooooooooooooooooooooooooooooooo
//---- other parameters static int prevtime=0; int ticket=0; int x=1; //---------------------------------------------- int Magic_BUY =123; int Magic_SELL =321;
//+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(Digits == 5) x=10; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //----
//---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //oooooooooooooooooooooooooooooooooooooooooooooooooooo if (Time[0] == prevtime) return(0); prevtime = Time[0]; if (!IsTradeAllowed()) { prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара--- } //ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам
Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода ------- double minlot = MarketInfo(Symbol(), MODE_MINLOT); int o = MathAbs(MathLog(minlot) *0.4343) + 0.5; double lot = minlot; //ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//--- if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) { lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o); } //ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo if(lot < minlot) lot = minlot; double maxlot =MarketInfo(Symbol(), MODE_MAXLOT); if(lot > maxlot) lot = maxlot; return(lot); } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
O tal vez escribir otro EA que trabajaría en el principio de 1 ha abierto, 2 ha abierto-1 ha cerrado, 3Abierto-2 ha cerrado, etc. ¡¡¡Ayuda realmente, realmente la necesito!!!
¡Por favor, ayuda! ¿Cómo hacer que un EA cierre una orden antigua al abrir una nueva? En el Probador de Estrategias funciona bien, pero en la cuenta real, por alguna razón, cuando abro una nueva, la antigua se va???????? ¡No tengo ni idea de programación((!
//---- input parameters //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_BUY=true; extern int SL_buy=62; //---входные параметры по лонгам extern int Risk_buy=0;
7777877: Mi objetivo en esta etapa es entender cómo funciona tal o cual función, y en este caso particular, cómo funciona la función ArrayGetAsSeries. Entiendo que se puede utilizar la función ArraySetAsSeries con el parámetro set=true, que establece forzosamente la indexación, como en array-timeseries. Pero quiero entender por qué en mi caso la función ArrayGetAsSeries devolvió 0, a pesar de que el array parece una serie temporal (es decir, está indexado como una serie temporal)
Precisamente porque sólo explica como una serie de tiempo.
Esto es sólo su opinión personal. Y si pones los números 1, 2, 1.2, 2.1, acabas con una serie temporal de la carne de cerdo desde 1927 (los números son condicionales). Pero esto no convierte a la matriz en una serie de tiempo - es necesario especificarlo explícitamente con la función
Me pregunto cómo has conseguido meter algo en el registro si el código que has presentado no compila.
Ah, si lo compilas, no tendrás ninguna rareza.
Te he dado la versión original arriba, que por supuesto compila. Tengo una pregunta. Por qué reemplazó las líneas:
price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i); // Цена в точке А
price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i); // Цена в точке В
doubleiMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
es decir, mi variablei_maTF( Period. Puede ser uno de los períodos de la carta. 0 significa el período del gráfico actual.) Tenía 0 especificado.i_maPeriod no se menciona.Por favor, aclárelo.
No, sólo significa que los datos coinciden con una parte de la historia.
Podría haberlo introducido manualmente, por ejemplo. O bien se escribe desde un archivo de texto. O podrías haberlo obtenido de una calculadora.
Porque incluso introduciendo algún dato condicional "1,25 1,16 1,73 1,35" podemos obtener el historial de alguna moneda de hace muchos años. Pero eso no significa que hayamos establecido una serie temporal de arreglos
He retocado un poco el guión original:
1. He copiado en la matriz personalizada sólo 5 últimos precios de apertura.
2. Calculado el array personalizado obtenido por los 5 precios de apertura copiados.
Esto es lo que tengo:
Como se puede ver en la figura, los precios de apertura están indexados en orden inverso (como lo demuestra el NÚMERO de precios de apertura de la barra (va en orden ascendente) y la HORA de los precios de apertura de la barra (va en orden descendente)), es decir, la matriz está organizada como una matriz-serie de tiempo.
Pero la función ArrayGetAsSeries devuelve sin embargo 0 (falso), lo que significa: el array del usuario NO está organizado como un array-serie.
Muy amablemente pido claridad
Pregunta: ¿cómo se puede explicar esto?
P.D. Gracias por responder a mis preguntas
He retocado un poco el guión original:
1. He copiado sólo los últimos 5 precios de apertura en un array personalizado.
2. Rasprocesó el array personalizado resultante por los 5 precios de apertura copiados.
Esto es lo que tengo:
Como se puede ver en la figura, los precios de apertura están indexados en orden inverso (como lo demuestra el NÚMERO de precios de apertura de la barra (va en orden ascendente) y la HORA de los precios de apertura de la barra (va en orden descendente)), es decir, la matriz está organizada como una matriz-serie de tiempo.
Pero la función ArrayGetAsSeries devuelve sin embargo 0 (falso), lo que significa: el array del usuario NO está organizado como un array-serie.
Por favor, aclare
Pregunta: ¿cómo explicarlo?
P.D. Gracias por responder a mis preguntas.
¿Ha intentado utilizar el
¿Ha probado las funciones
i_maTF == Period() ??????
i_maPeriod toma un valor razonable???
Bueno, tal vez hay algo mal con i_maShiftByPrice??
Es difícil ser más preciso.
La información que emite no es correcta. Aquí está el código completo:
El registro del Asesor Experto muestra esto:
Como puedes ver, las variables i_maTF, i_maPeriod y i_maPrice no son las que he inicializado. ¿Qué pasa?
La salida de la información es errónea. Aquí está el código completo:
El registro de expertos muestra esto:
Como puede ver, las variables i_maTF, i_maPeriod y i_maPrice no son las mismas que he inicializado. ¿Qué pasa?
Me pregunto cómo has conseguido que aparezca algo en el registro si el código que has enviado no compila.
Ah, si lo compila, no habrá ninguna rareza.
Me pregunto cómo has conseguido meter algo en el registro si el código que has presentado no compila.
Ah, si lo compilas, no tendrás ninguna rareza.
Siempre compilo normalmente.
He limpiado el código de impresoras y variables extra para no confundir a nadie. Pero no los he eliminado abajo, por lo que no ha compilado. Aquí está el código completo que compila:
¡Por favor, ayuda! ¿Cómo hacer que un EA cierre una orden antigua al abrir una nueva? En el Probador de Estrategias funciona bien, pero en la cuenta real, por alguna razón, cuando abro una nueva, la antigua se va???????? Soy un cero total en programación(((
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_SELL=true;
extern int SL_sell=62; //---входные параметры по шортам
extern int Risk_sell=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
//---- other parameters
static int prevtime=0;
int ticket=0;
int x=1;
//----------------------------------------------
int Magic_BUY =123;
int Magic_SELL =321;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits == 5) x=10;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//oooooooooooooooooooooooooooooooooooooooooooooooooooo
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
if (!IsTradeAllowed()) {
prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара---
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам
Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
return(0);//-----------выход из стартовой функции------------
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void Trade(int mn,bool flag,double price,int period_1,int period_2,int sl,int Risk) {
int total=OrdersTotal();
for (int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//---проход по ордерам--
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {
if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------
OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates();
}
return(0);
}
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooo
ticket = -1;
if ( flag &&
Open[period_1]>Open[period_2] && //----вход в рынок по условию---
OrdersTotal()<2 && //-----ограничения чемпионата------
AccountEquity()>200 &&
IsTradeAllowed()) {
if (mn<200) {
ticket= OrderSend(Symbol(), OP_BUY,lot(Risk_buy),Ask,5,Bid-x*sl*Point,0,DoubleToStr(mn,0),mn,0,Blue);
}
else {
ticket= OrderSend(Symbol(),OP_SELL,lot(Risk_sell),Bid,5,Ask+x*sl*Point,0,DoubleToStr(mn,0),mn,0, Red);
}
RefreshRates();
if ( ticket < 0) { Sleep(30000); prevtime = Time[1]; }
} //-- Exit ---
return(0); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода -------
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
int o = MathAbs(MathLog(minlot) *0.4343) + 0.5;
double lot = minlot;
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//---
if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) {
lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o);
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
if(lot < minlot) lot = minlot;
double maxlot =MarketInfo(Symbol(), MODE_MAXLOT);
if(lot > maxlot) lot = maxlot;
return(lot); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
O tal vez escribir otro EA que trabajaría en el principio de 1 ha abierto, 2 ha abierto-1 ha cerrado, 3Abierto-2 ha cerrado, etc. ¡¡¡Ayuda realmente, realmente la necesito!!!
¡Por favor, ayuda! ¿Cómo hacer que un EA cierre una orden antigua al abrir una nueva? En el Probador de Estrategias funciona bien, pero en la cuenta real, por alguna razón, cuando abro una nueva, la antigua se va???????? ¡No tengo ni idea de programación((!
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
Sustituir
a
Mi objetivo en esta etapa es entender cómo funciona tal o cual función, y en este caso particular, cómo funciona la función ArrayGetAsSeries. Entiendo que se puede utilizar la función ArraySetAsSeries con el parámetro set=true, que establece forzosamente la indexación, como en array-timeseries. Pero quiero entender por qué en mi caso la función ArrayGetAsSeries devolvió 0, a pesar de que el array parece una serie temporal (es decir, está indexado como una serie temporal)
Precisamente porque sólo explica como una serie de tiempo.
Esto es sólo su opinión personal. Y si pones los números 1, 2, 1.2, 2.1, acabas con una serie temporal de la carne de cerdo desde 1927 (los números son condicionales). Pero esto no convierte a la matriz en una serie de tiempo - es necesario especificarlo explícitamente con la función
Me pregunto cómo has conseguido meter algo en el registro si el código que has presentado no compila.
Ah, si lo compilas, no tendrás ninguna rareza.
Te he dado la versión original arriba, que por supuesto compila. Tengo una pregunta. Por qué reemplazó las líneas:
i_maTF aPeriod(). ¿Me equivoco?
La documentación dice que al calcular la media móvil:
es decir, mi variablei_maTF( Period. Puede ser uno de los períodos de la carta. 0 significa el período del gráfico actual.) Tenía 0 especificado.i_maPeriod no se menciona.Por favor, aclárelo.