per memorizzare nella sua struttura o array i prezzi richiesti con i biglietti e forse qualcos'altro, per esempio il tempo, e ordinare immediatamente dopo l'aggiunta per prezzo. Per risorse, se non si guarda spesso, è lo stesso o un po 'più costoso, e se spesso, è meglio ricordare. Naturalmente, se non hai 100500 ordini) allora potrebbe essere troppo costoso. In generale, l'ordinamento in una struttura o array multidimensionale è risolto solo per il primo indice purtroppo.
A volte uso diversi array monodimensionali con gli stessi indici, biglietti, tempo, prezzi. E ricerca per indice della proprietà necessaria. Per esempio, otteniamo l'indice di un tempo minore o di un prezzo maggiore e otteniamo il biglietto dell'ordine necessario. Certo, è una stampella, ma funziona chiaramente.
per memorizzare nella sua struttura o array i prezzi desiderati con i biglietti e forse qualcos'altro, come il tempo, e ordinare immediatamente dopo l'aggiunta per prezzo. Per risorse, se non si guarda spesso, è lo stesso o un po 'più costoso, e se spesso, è meglio ricordare. Naturalmente, se non hai 100500 ordini) allora potrebbe essere troppo costoso. In generale, l'ordinamento in una struttura o in una matrice multidimensionale è risolto solo per il primo indice purtroppo.
A volte uso diversi array monodimensionali con gli stessi indici, biglietti, tempo, prezzi. E ricerca per indice della proprietà necessaria. Per esempio, se otteniamo l'indice di un tempo minore o un prezzo maggiore, otteniamo il biglietto dell'ordine necessario. Certo, è una stampella, ma funziona molto bene.
L'ho fatto in questo modo:
enum MT_ORD_STATE
{
ORD_NA, // Not available
ORD_SENT,
ORD_ACTIVE,
ORD_CHANGE_SENT,
ORD_DEL_SENT
};
struct MTOrder
{
ulong id;
ulong Ticket;
datetime Time;
datetime TimeNotFound;
double Price;
double Vol;
double VolInit;
uint request_id;
ENUM_ORDER_TYPE Type;
ENUM_ORDER_STATE State;
MT_ORD_STATE MTState;
int Reserved;
bool Idf; // Identified
};
...
MTOrder Orders[]; // С начала массива - ордера на покупку, по убыванию цены,// С конца - на продажу, по возрастанию
L'array è sempre ordinato, un nuovo ordine viene inserito nel punto richiesto, con spostamento di altri ordini, quando un ordine viene cancellato c'è uno spostamento.
L'array è sempre ordinato, un nuovo ordine viene inserito al punto giusto, con uno spostamento di altri ordini, quando un ordine viene cancellato c'è uno spostamento.
Ma questo è in MT5.
Sarebbe bello avere del codice per lo spostamento durante la scrittura, la cancellazione e l'ordinamento. Non è un compito banale per me ordinare la struttura dell'array per campi. Sì, e anche i turni).
Il codice di spostamento per scrivere, cancellare e ordinare sarebbe buono. Non è un compito banale per me ordinare una struttura di array per campi. E anche i turni).
bool Tr2MT::InsertOrder(MTOrder &ord_tmp) // Из AddOrder (2 варианта), единственное место добавления ордеров в массив
{
int i=0,n=0;
string str="";
ord_tmp.id=++st.LastOrdID;
switch(ord_tmp.Type)
{
caseORDER_TYPE_BUY:
caseORDER_TYPE_BUY_LIMIT:
for(i=0,n=-1;i<ArraySize(Orders);i++)
{
if(Orders[i].id==0)
{
n=i; break;
}
}
if(n<0) break;
for(i=n;i>=0;i--)
{
if(i==0 || Orders[i-1].Price>=ord_tmp.Price)
{
Orders[i]=ord_tmp;
SaveState();
//str=OrdString();//Log(str);returntrue; //добавили
}
else
{
Orders[i]=Orders[i-1];
}
}
break;
caseORDER_TYPE_SELL:
caseORDER_TYPE_SELL_LIMIT:
for(i=ArraySize(Orders)-1,n=-1;i>=0;i--)
{
if(Orders[i].id==0)
{
n=i;
break;
}
}
if(n<0) break;
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1 || Orders[i+1].Price<=ord_tmp.Price)
{
Orders[i]=ord_tmp;
SaveState();
//str=OrdString();//Log(str);returntrue; //добавили
}
else
{
Orders[i]=Orders[i+1];
}
}
break;
default:
returnfalse;
break;
}
str="Can't add order - out of array!";
ErrLog(str);
returnfalse; //не нашли места для ордера
}
bool Tr2MT::UpdOrder(int n) // Только если есть тикет или угадываем
{
string str;
int i;
bool flag=false;
MTOrder ord_tmp={0};
ulong ticket=Orders[n].Ticket;
if(ticket==0)
{
if(!GuessOrdTicket(n))returnfalse; // Если угадываем - он будет в Orders[n].Ticketelse ticket=Orders[n].Ticket;
}
switch(FindOrder(ticket,Orders[n].Time+100000))
{
case ORD_FOUND: //изменён или просто проверка//update (sync) orderif(Orders[n].Price==OrderGetDouble(ORDER_PRICE_OPEN)) // Цена не изменилась
{
if(Orders[n].State==(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)&&Orders[n].MTState!=ORD_NA)
{
if(Orders[n].Vol==OrderGetDouble(ORDER_VOLUME_CURRENT))
returntrue; // Не нужно сохранять состояние, можно сразу выйтиelse
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
else
{
//Orders[n].State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(Orders[n],(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE)); // Обнулит и TimeNotFoundif(Orders[n].Vol!=OrderGetDouble(ORDER_VOLUME_CURRENT))
Orders[n].Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
}
}
else// Цена изменилась
{
ord_tmp=Orders[n];
//ord_tmp.State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
SetOrdState(ord_tmp,(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE));
ord_tmp.Price=OrderGetDouble(ORDER_PRICE_OPEN);
ord_tmp.Vol=OrderGetDouble(ORDER_VOLUME_CURRENT);
switch(Orders[n].Type)
{
caseORDER_TYPE_BUY:
caseORDER_TYPE_BUY_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| ord_tmp.Price<=Orders[i-1].Price) // Следующий - по большей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| Orders[i+1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price>Orders[i+1].Price // Следующий - по меньшей цене, вставляем перед ним
|| Orders[i+1].Price>Orders[i].Price) // Следующий - ордер уже на продажу
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
caseORDER_TYPE_SELL:
caseORDER_TYPE_SELL_LIMIT:
if(ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
{
for(i=n;i>=0;i--)
{
if(i==0// Конец массива ордеров
|| Orders[i-1].Ticket==0// Следующий элемент пустой
|| ord_tmp.Price<Orders[i-1].Price // Следующий - по большей цене, вставляем перед ним
|| Orders[i-1].Price<Orders[i].Price) // Следующий - ордер уже на покупку
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i-1]; // Сдвигаем следующий элемент
}
}
}
else// Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
{
for(i=n;i<ArraySize(Orders);i++)
{
if(i==ArraySize(Orders)-1// Конец массива ордеров
|| ord_tmp.Price>Orders[i+1].Price) // Следующий - по меньшей цене, вставляем перед ним
{
Orders[i]=ord_tmp;
break;
}
else
{
Orders[i]=Orders[i+1]; // Сдвигаем следующий элемент
}
}
}
break;
default:
returnfalse;
break;
}
}
SaveState();
//str=OrdString();//Log(str);break;
case ORD_HIST_FOUND: //исполнен || снят//delete orderif(!DelOrder(n))
returnfalse;
SaveState();
str=OrdHistString(ticket); // Уточнить
Log(str);
break;
case ORD_NOT_FOUND: //отправлен в историю?if(Orders[n].MTState!=ORD_NA)
{
Orders[n].MTState=ORD_NA;
Orders[n].TimeNotFound=TimeCurrent();
SaveState();
printf(__FUNCTION__, "Order not found, ticket:",IntegerToString(Orders[n].Ticket)," TimeNF:",TimeToString(Orders[n].TimeNotFound,TIME_SECONDS));
}
else
{
if(TimeCurrent()-Orders[n].TimeNotFound>60) // > 60 секунд не найден
{
if(!DelOrder(n))
returnfalse;
SaveState();
str="Order not found >60s "+IntegerToString(ticket)+"\n";
Log(str);
}
}
break;
default:
returnfalse; //не тот ордерbreak;
}
returntrue;
}
Non male. Non mi piace arrays)))), e non funziona mai la prima volta senza fare il debug in array. ))) Soprattutto i turni, la copia, l'ordinamento non regolare))
Non male. Non mi piace arrays)))), e non funziona mai la prima volta senza fare il debug in array. ))) Soprattutto i turni, la copia, l'ordinamento non regolare))
Ogni strumento è buono per se stesso.
Ma, insidioso controllo e ricontrollo degli errori off-by-one ))
Salve. Se sono nel posto sbagliato, per favore consigliatemi dove scrivere, grazie.
Cerco un Expert Advisor MT5 gratuito che chiuda le posizioni TUTTE quando viene raggiunto un profitto o una perdita, specificato nelle impostazioni, e apra immediatamente nuove posizioni nella direzione specificata nelle impostazioni. Qualcuno può darmi un link al thread? O forse conosci un EA che apre solo 1 posizione sul mercato se vede che non ci sono posizioni aperte e non chiude.
per memorizzare nella sua struttura o array i prezzi richiesti con i biglietti e forse qualcos'altro, per esempio il tempo, e ordinare immediatamente dopo l'aggiunta per prezzo. Per risorse, se non si guarda spesso, è lo stesso o un po 'più costoso, e se spesso, è meglio ricordare. Naturalmente, se non hai 100500 ordini) allora potrebbe essere troppo costoso. In generale, l'ordinamento in una struttura o array multidimensionale è risolto solo per il primo indice purtroppo.
A volte uso diversi array monodimensionali con gli stessi indici, biglietti, tempo, prezzi. E ricerca per indice della proprietà necessaria. Per esempio, otteniamo l'indice di un tempo minore o di un prezzo maggiore e otteniamo il biglietto dell'ordine necessario. Certo, è una stampella, ma funziona chiaramente.
per memorizzare nella sua struttura o array i prezzi desiderati con i biglietti e forse qualcos'altro, come il tempo, e ordinare immediatamente dopo l'aggiunta per prezzo. Per risorse, se non si guarda spesso, è lo stesso o un po 'più costoso, e se spesso, è meglio ricordare. Naturalmente, se non hai 100500 ordini) allora potrebbe essere troppo costoso. In generale, l'ordinamento in una struttura o in una matrice multidimensionale è risolto solo per il primo indice purtroppo.
A volte uso diversi array monodimensionali con gli stessi indici, biglietti, tempo, prezzi. E ricerca per indice della proprietà necessaria. Per esempio, se otteniamo l'indice di un tempo minore o un prezzo maggiore, otteniamo il biglietto dell'ordine necessario. Certo, è una stampella, ma funziona molto bene.
L'ho fatto in questo modo:
enum MT_ORD_STATE { ORD_NA, // Not available ORD_SENT, ORD_ACTIVE, ORD_CHANGE_SENT, ORD_DEL_SENT }; struct MTOrder { ulong id; ulong Ticket; datetime Time; datetime TimeNotFound; double Price; double Vol; double VolInit; uint request_id; ENUM_ORDER_TYPE Type; ENUM_ORDER_STATE State; MT_ORD_STATE MTState; int Reserved; bool Idf; // Identified }; ... MTOrder Orders[]; // С начала массива - ордера на покупку, по убыванию цены, // С конца - на продажу, по возрастаниюL'array è sempre ordinato, un nuovo ordine viene inserito nel punto richiesto, con spostamento di altri ordini, quando un ordine viene cancellato c'è uno spostamento.
Ma questo è in MT5
L'ho fatto in questo modo:
L'array è sempre ordinato, un nuovo ordine viene inserito al punto giusto, con uno spostamento di altri ordini, quando un ordine viene cancellato c'è uno spostamento.
Ma questo è in MT5.
Sarebbe bello avere del codice per lo spostamento durante la scrittura, la cancellazione e l'ordinamento. Non è un compito banale per me ordinare la struttura dell'array per campi. Sì, e anche i turni).
Il codice di spostamento per scrivere, cancellare e ordinare sarebbe buono. Non è un compito banale per me ordinare una struttura di array per campi. E anche i turni).
E probabilmente la parte più interessante:
Grazie.
Non male. Non mi piace arrays)))), e non funziona mai la prima volta senza fare il debug in array. ))) Soprattutto i turni, la copia, l'ordinamento non regolare))Grazie.
Non male. Non mi piace arrays)))), e non funziona mai la prima volta senza fare il debug in array. ))) Soprattutto i turni, la copia, l'ordinamento non regolare))Ogni strumento è buono per se stesso.
Ma, insidioso controllo e ricontrollo degli errori off-by-one ))
Ecco cosa significa dare una nuova occhiata al tuo vecchio codice!
Vedo due difetti identici, vestigia della versione precedente.
Una sub-ottimalità evidente.
E un design obsoleto.
Cerco un Expert Advisor MT5 gratuito che chiuda le posizioni TUTTE quando viene raggiunto un profitto o una perdita, specificato nelle impostazioni, e apra immediatamente nuove posizioni nella direzione specificata nelle impostazioni. Qualcuno può darmi un link al thread?
O forse conosci un EA che apre solo 1 posizione sul mercato se vede che non ci sono posizioni aperte e non chiude.
MT4 1353
Che tipo di errore viene mostrato nel log?
Il codice funziona correttamente
MT4 1353
Che tipo di errore viene mostrato nel log?
Il codice funziona correttamente.
Sembra che alcuni oggetti creati tramite "new" non vengano distrutti all'uscita.