No, significa solo che i dati corrispondono a un pezzo di storia.
Avresti potuto inserirlo manualmente, per esempio. O scritto da un file di testo. O potrebbe averla ottenuta da un calcolo.
Perché anche inserendo alcuni dati condizionali "1,25 1,16 1,73 1,35" potremmo ottenere la storia di qualche valuta molti anni fa. Ma questo non significa che abbiamo impostato una serie temporale di array
Ho modificato un po' lo script originale:
1. Ho copiato solo 5 ultimi prezzi di apertura in un array personalizzato.
2. Calcolato l'array personalizzato ottenuto da tutti e 5 i prezzi di apertura copiati.
/+------------------------------------------------------------------------------------------+
//| 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 -
Ecco cosa ho ottenuto:
Come si può vedere dalla figura, i prezzi aperti sono indicizzati in ordine inverso (come evidenziato dal NUMERO dei prezzi aperti delle barre (va in ordine crescente) e dal TEMPO dei prezzi aperti delle barre (va in ordine decrescente)), cioè l'array è organizzato come un array-timeseries.
Ma la funzione ArrayGetAsSeries restituisce comunque 0 (falso), il che significa: l'array utente NON è organizzato come un array-tempi.
1. Ho copiato solo gli ultimi 5 prezzi di apertura in un array personalizzato.
2. Ras ha elaborato l'array personalizzato risultante per tutti e 5 i prezzi di apertura copiati.
Ecco cosa ho ottenuto:
Come si può vedere dalla figura, i prezzi aperti sono indicizzati in ordine inverso (come evidenziato dal NUMERO dei prezzi aperti delle barre (va in ordine crescente) e dal TEMPO dei prezzi aperti delle barre (va in ordine decrescente)), cioè l'array è organizzato come un array-timeseries.
Ma la funzione ArrayGetAsSeries restituisce comunque 0 (falso), il che significa: l'array utente NON è organizzato come un array-tempi.
Si prega di chiarire
Domanda: come spiegarlo?
P.S. Grazie per aver risposto alle mie domande.
Avete provato a usare il
boolArraySetAsSeries(
void array[], bool set)
Imposta la direzione di indicizzazione di una matrice. Unset TRUE imposta la direzione di indicizzazione in ordine inverso, cioè l'ultimo elemento ha un indice zero. Un valore di FALSE imposta la normale direzione di indicizzazione. La funzione restituisce lo stato precedente.
Imposta la direzione di indicizzazione dell'array. Unvalore di TRUE imposta la direzione di indicizzazione in ordine inverso, cioè l'ultimo elemento ha un indice zero. Un valore di FALSE imposta la normale direzione di indicizzazione. La funzione restituisce lo stato precedente.
Parametri:
array[]
-
Matrice numerica da impostare.
impostare
-
La direzione in cui è indicizzato l'array.
Il mio obiettivo in questa fase è capire come funziona una particolare funzione, e in questo caso particolare, come funziona la funzione ArrayGetAsSeries. Ho capito che posso usare la funzione ArraySetAsSeries con il parametro set=true, che imposta forzatamente l'indicizzazione, come in array-timeseries. Ma voglio capire perché nel mio caso la funzione ArrayGetAsSeries ha restituito 0, nonostante l'array sembri una serie temporale (cioè indicizzato come una serie temporale)
Beh, forse c'è qualcosa di sbagliato in i_maShiftByPrice?
È difficile essere più precisi.
Le informazioni che emette non sono corrette. Ecco il codice 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);
}
// -------------- блок деинициализации закончен ---------------------- */
Mi chiedo come hai fatto a mettere qualcosa nel log se il codice che hai presentato non si compila?
Ah, se lo compili, non avrai nessuna stranezza.
Compilo sempre normalmente.
Ho pulito il codice da stampanti e variabili extra per non confondere nessuno. Ma non li ho rimossi sotto, quindi non ha compilato. Ecco il codice completo che 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);
}
// -------------- блок деинициализации закончен ---------------------- */
Per favore, aiutatemi! Come fare in modo che un EA chiuda un vecchio ordine quando ne apre uno nuovo? Nello Strategy Tester funziona bene, ma sul conto reale per qualche motivo quando ne apro uno nuovo, il vecchio se ne va???????? Sono uno zero totale nella programmazione(((
//---- 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 forse scrivere un altro EA che lavorerebbe sul principio di 1 ha aperto, 2 ha aperto-1 ha chiuso, 3 ha aperto-2 ha chiuso, ecc. Aiuto davvero, davvero bisogno!!!
Per favore, aiutatemi! Come fare in modo che un EA chiuda un vecchio ordine quando ne apre uno nuovo? Nello Strategy Tester funziona bene, ma sul conto reale per qualche motivo quando ne apro uno nuovo, il vecchio se ne va???????? Non ho nessuna idea di programmazione((!
//---- input parameters //ooooooooooooooooooooooooooooooooooooooooooooooooo extern bool In_BUY=true; extern int SL_buy=62; //---входные параметры по лонгам extern int Risk_buy=0;
7777877: Il mio obiettivo in questa fase è capire come funziona questa o quella funzione, e in questo caso particolare, come funziona la funzione ArrayGetAsSeries. Ho capito che si può usare la funzione ArraySetAsSeries con il parametro set=true, che imposta forzatamente l'indicizzazione, come in array-timeseries. Ma voglio capire perché nel mio caso la funzione ArrayGetAsSeries ha restituito 0, nonostante l'array sembri una serie temporale (cioè indicizzato come una serie temporale)
Proprio perché si spiega solo come una serie temporale.
Questa è solo la tua opinione personale. E se ci metti i numeri 1, 2, 1.2, 2.1, ti ritrovi con una serie temporale per il maiale dal 1927 (i numeri sono condizionati). Ma questo non rende l'array una serie temporale - è necessario specificarlo esplicitamente con la funzione
Capisco che non voglio speculare, ma puoi almeno darmi un suggerimento se il problema ti è chiaro?
Dammi tutto il codice
No, significa solo che i dati corrispondono a un pezzo di storia.
Avresti potuto inserirlo manualmente, per esempio. O scritto da un file di testo. O potrebbe averla ottenuta da un calcolo.
Perché anche inserendo alcuni dati condizionali "1,25 1,16 1,73 1,35" potremmo ottenere la storia di qualche valuta molti anni fa. Ma questo non significa che abbiamo impostato una serie temporale di array
Ho modificato un po' lo script originale:
1. Ho copiato solo 5 ultimi prezzi di apertura in un array personalizzato.
2. Calcolato l'array personalizzato ottenuto da tutti e 5 i prezzi di apertura copiati.
Ecco cosa ho ottenuto:
Come si può vedere dalla figura, i prezzi aperti sono indicizzati in ordine inverso (come evidenziato dal NUMERO dei prezzi aperti delle barre (va in ordine crescente) e dal TEMPO dei prezzi aperti delle barre (va in ordine decrescente)), cioè l'array è organizzato come un array-timeseries.
Ma la funzione ArrayGetAsSeries restituisce comunque 0 (falso), il che significa: l'array utente NON è organizzato come un array-tempi.
Chiedo molto gentilmente di fare chiarezza
Domanda: come si può spiegare questo?
P.S. Grazie per aver risposto alle mie domande
Ho modificato un po' lo script originale:
1. Ho copiato solo gli ultimi 5 prezzi di apertura in un array personalizzato.
2. Ras ha elaborato l'array personalizzato risultante per tutti e 5 i prezzi di apertura copiati.
Ecco cosa ho ottenuto:
Come si può vedere dalla figura, i prezzi aperti sono indicizzati in ordine inverso (come evidenziato dal NUMERO dei prezzi aperti delle barre (va in ordine crescente) e dal TEMPO dei prezzi aperti delle barre (va in ordine decrescente)), cioè l'array è organizzato come un array-timeseries.
Ma la funzione ArrayGetAsSeries restituisce comunque 0 (falso), il che significa: l'array utente NON è organizzato come un array-tempi.
Si prega di chiarire
Domanda: come spiegarlo?
P.S. Grazie per aver risposto alle mie domande.
Avete provato a usare il
Avete provato le funzioni
i_maTF == Periodo() ??????
i_maPeriod prende un valore ragionevole???
Beh, forse c'è qualcosa di sbagliato in i_maShiftByPrice?
È difficile essere più precisi.
Le informazioni che emette non sono corrette. Ecco il codice completo:
Il registro di Expert Advisor mostra questo:
Come potete vedere, le variabili i_maTF, i_maPeriod e i_maPrice non sono quelle che ho inizializzato. Cosa c'è che non va?
Emette un'informazione sbagliata. Ecco il codice completo:
Il registro di Expert mostra questo:
Come potete vedere, le variabili i_maTF, i_maPeriod e i_maPrice non sono le stesse che ho inizializzato. Cosa c'è che non va?
Mi chiedo come hai fatto ad avere qualcosa nel log se il codice che hai inviato non si compila?
Ah, se lo compili, non ci sarà nessuna stranezza.
Mi chiedo come hai fatto a mettere qualcosa nel log se il codice che hai presentato non si compila?
Ah, se lo compili, non avrai nessuna stranezza.
Compilo sempre normalmente.
Ho pulito il codice da stampanti e variabili extra per non confondere nessuno. Ma non li ho rimossi sotto, quindi non ha compilato. Ecco il codice completo che compila:
Per favore, aiutatemi! Come fare in modo che un EA chiuda un vecchio ordine quando ne apre uno nuovo? Nello Strategy Tester funziona bene, ma sul conto reale per qualche motivo quando ne apro uno nuovo, il vecchio se ne va???????? Sono uno zero totale nella programmazione(((
//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 forse scrivere un altro EA che lavorerebbe sul principio di 1 ha aperto, 2 ha aperto-1 ha chiuso, 3 ha aperto-2 ha chiuso, ecc. Aiuto davvero, davvero bisogno!!!
Per favore, aiutatemi! Come fare in modo che un EA chiuda un vecchio ordine quando ne apre uno nuovo? Nello Strategy Tester funziona bene, ma sul conto reale per qualche motivo quando ne apro uno nuovo, il vecchio se ne va???????? Non ho nessuna idea di programmazione((!
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
Sostituire
a
Il mio obiettivo in questa fase è capire come funziona questa o quella funzione, e in questo caso particolare, come funziona la funzione ArrayGetAsSeries. Ho capito che si può usare la funzione ArraySetAsSeries con il parametro set=true, che imposta forzatamente l'indicizzazione, come in array-timeseries. Ma voglio capire perché nel mio caso la funzione ArrayGetAsSeries ha restituito 0, nonostante l'array sembri una serie temporale (cioè indicizzato come una serie temporale)
Proprio perché si spiega solo come una serie temporale.
Questa è solo la tua opinione personale. E se ci metti i numeri 1, 2, 1.2, 2.1, ti ritrovi con una serie temporale per il maiale dal 1927 (i numeri sono condizionati). Ma questo non rende l'array una serie temporale - è necessario specificarlo esplicitamente con la funzione