Capisco che al momento questo è tutt'altro che una forma accettabile, ma si può dimostrare perché, nel caso di un acquisto, non riesco a ottenere una determinata linea tratteggiata del colore specificato, anche se emetterà tranquillamente il bianco o solo verde.
Bene
doppio OP = 5.00000
TP = (OP/100);
Stampa("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
Non capisco perché quando si divide 5 per 100 sarà 0,5
Ho pubblicato il codice corretto per te, come dovrebbe essere
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ voidOnTick () { { if ( Bars < 801 || ( IsTradeAllowed ()== false )) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли return ; } //+----------------------------------------------------------------
} //+------------------------------------------------------------------+ bool myOrdersTotal() //если ордера есть { for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров { if ((( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))== true ) && OrderSymbol ()== Symbol () && ( OrderType ()< 2 )) { returntrue ; } } returnfalse ; } //------------------------------------------------------------------- double FindLastOrderOpenPrice() { double oldorderopenprice= 0 ; int oldticket= 0 ; ticket= 0 ; for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров { if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic) && ( OrderType ()== OP_BUY || OrderType ()== OP_SELL )) { oldticket= OrderTicket (); if (oldticket>=ticket) { ticket=oldticket; oldorderopenprice= OrderOpenPrice (); } } } return (oldorderopenprice); } //-------------------------------------------------------------------
//+------------------------------------------------------------------+ //| Создает горизонтальную линию | //+------------------------------------------------------------------+ bool HLineCreate( constlong chart_ID= 0 , // ID графика conststring name= "HLine" , // имя линии constint sub_window= 0 , // номер подокна double price= 0 , // цена линии constcolor clr= clrRed , // цвет линии constENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии constint width= 1 , // толщина линии constbool back= false , // на заднем плане constbool selection= true , // выделить для перемещений constbool hidden= true , // скрыт в списке объектов constlong z_order= 0 ) // приоритет на нажатие мышью { //--- если цена не задана, то установим ее на уровне текущей цены Bid if (!price) price= SymbolInfoDouble ( Symbol (), SYMBOL_BID ); //--- сбросим значение ошибки ResetLastError (); //--- создадим горизонтальную линию if ( ObjectFind (chart_ID,name)!=sub_window) { if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price)) { Print ( __FUNCTION__ , ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ()); return ( false ); } } //--- установим цвет линии ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr); //--- установим стиль отображения линии ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style); //--- установим толщину линии ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back); //--- включим (true) или отключим (false) режим перемещения линии мышью //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection); ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order); //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Перемещение горизонтальной линии | //+------------------------------------------------------------------+ bool HLineMove( constlong chart_ID= 0 , // ID графика conststring name= "HLine" , // имя линии double price= 0 ) // цена линии { //--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid if (!price) price= SymbolInfoDouble ( Symbol (), SYMBOL_BID ); //--- сбросим значение ошибки ResetLastError (); //--- переместим горизонтальную линию if ( ObjectFind (chart_ID,name)==- 1 ) return ( false ); if (! ObjectMove (chart_ID,name, 0 , 0 ,price)) { Print ( __FUNCTION__ , ": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ()); return ( false ); } //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+ //| Удаляет горизонтальную линию | //+------------------------------------------------------------------+ bool HLineDelete( constlong chart_ID= 0 , // ID графика conststring name= "HLine" ) // имя линии { //--- сбросим значение ошибки ResetLastError (); //--- удалим горизонтальную линию if ( ObjectFind (chart_ID,name)==- 1 ) return ( false ); if (! ObjectDelete (chart_ID,name)) { Print ( __FUNCTION__ , ": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ()); return ( false ); } //--- успешное выполнение return ( true ); } //+------------------------------------------------------------------+
Capisco che tutto ciò è tutt'altro che accettabile al momento, ma potete mostrarmi perché non posso ottenere unalinea tratteggiata di un colore specificato nel caso di un acquisto, anche se bianca o verde semplice darà facilmente fuori.
e
doppio OP = 5.00000
TP = (OP/100);
Stampa("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
Non capisco da quando si divide 5 per 100 è 0,5
Non so perché non riesci a dividerlo bene, per me funziona tutto
voidOnStart() { //--- double OP = 5.00000;
double TP = OP/100;
Print("TP= ",TP); }
Risultato
2017.02.1006:22:48.633 Script test USDCHF,H1: loaded successfully 2017.02.1006:22:48.663 test USDCHF,H1: initialized 2017.02.1006:22:48.663 test USDCHF,H1: TP= 0.05 2017.02.1006:22:48.663 test USDCHF,H1: uninit reason 0 2017.02.1006:22:48.663 Script test USDCHF,H1: removed
Non so perché non puoi dividerlo bene, per me è tutto divisibile
Capisco il principio, taglierà il codice attuale di circa la metà se funziona. Per quanto riguarda il precedente, non è partito. È semplicemente morto insieme al terminale, venendo sovrascritto da un foglio vuoto.
Sto modificando un ordine pendente cambiando il prezzo di apertura. Richiesta di un nuovo prezzo aperto dopo un cambiamento riuscito. La risposta dà a il vecchio, precedente prezzo. In qual è il problema?
Sto modificando un ordine pendente cambiando il prezzo di apertura. Richiesta di un nuovo prezzo aperto dopo un cambiamento riuscito. La risposta dà a il vecchio, precedente prezzo. In qual è il problema?
modifica #1 comprare stop 1.00 GBPUSD a 1.60150 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6028
modifica #1 comprare stop 1.00 GBPUSD a 1.60070 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6015
OrderOpenPrice() memorizza il prezzo che era presente quando OrderSelect() è stato applicato. Il valore non cambierà da solo, in nessun modo. Devi chiamare di nuovo OrderSelect() dopo aver modificato l'ordine.
Vitalie Postolache: OrderOpenPrice() memorizza il prezzo che era presente quando OrderSelect() è stato applicato. Il valore non cambierà da solo, in nessun modo. Dovremmo chiamare nuovamente OrderSelect() dopo aver modificato l'ordine.
int SizeMass=ArraySize(summDelta);//Узнаем размер массива int CalcZrero=0; for(int i=0;i<SizeMass;i++) { Print ("Число на проверку=",summDelta[i], " цикл ",i); if (summDelta[i]!=0) { Print ("Число до исключения нуля=",summDelta[i], " цикл ",i); for(int i=0;i<SizeMass;i++) printf("Состав массива до исключения нуля summDelta[%d] = %G",i,summDelta[i]); ArrayCopy(summDelta,summDelta,i-CalcZrero,i); Print ("Число после исключения нуля=",summDelta[i-CalcZrero], " цикл ",i); for(int i=0;i<SizeMass;i++) printf("Состав массива после исключения нуля summDelta[%d] = %G",i,summDelta[i]); } else CalcZrero++; }
for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля summDelta[%d] = %G",i,summDelta[i]); ArrayResize(summDelta,SizeMass-CalcZrero,0); SizeMass=ArraySize(summDelta);//Узнаем новый размер массива for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля и обрезания summDelta[%d] = %G",i,summDelta[i]); } //+------------------------------------------------------------------+
L'obiettivo è quello di tagliare gli zeri (altri numeri) dalla matrice, pur mantenendo la sequenza dei numeri nella matrice
Ho fatto questo codice, ma l'array viene sovrascritto - c'è qualcosa che non va - per favore consigliatemi cosa c'è di sbagliato.
A colpo d'occhio, l'avrei fatto in modo diverso.
double a[ 20 ] = { /*массив значений*/ }; double b[ 20 ]; //--- Проверяем массив а на наличие 0 значений int j = 0; for( int i = 0; i < 20; i++ ) { if( a[ i ] != 0 ) { b[ j ] = a[ i ]; j++; } } //--- Изменяем размер массива а на значение j //--- Копируем массив b в массив a
Sì, c'è anche una questione di correttezza nel confrontare i numeri reali con 0 con questo metodo.
Sto pensando a un compito come questo, non l'ho provato nella vita reale, dovrei farlo o no. O indicare altre opzioni.
Supponiamo che io abbia un segnale - in caso di forte allargamento dello spread (su notizie)
chiudere tutte le operazioni in corso
Ma gli ordini non saranno dati solo per chiudere o aprire durante le notizie
Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo e lo eseguiamo finché non si chiude (in modo simile a OrderSend) e altri comandi che possono terminare senza successo
ok ho capito
Capisco che al momento questo è tutt'altro che una forma accettabile, ma si può dimostrare perché, nel caso di un acquisto, non riesco a ottenere una determinata linea tratteggiata del colore specificato, anche se emetterà tranquillamente il bianco o solo verde.
Bene
doppio OP = 5.00000
TP = (OP/100);
Stampa("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
Non capisco perché quando si divide 5 per 100 sarà 0,5
Ho pubblicato il codice corretto per te, come dovrebbe essere
//| Close_MA.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern bool Uslovie1= false ; //Uslovie 4 6+50 MA
extern bool OpenOrders= false ; //+---Открыть ордер
extern double Lots= 0.01 ; //Oбьем открываемого ордера
extern const string Настройки_работы_советника= "" ;
extern int Period1= 6 ; //Период 1МА
extern ENUM_APPLIED_PRICE PRICE1= PRICE_MEDIAN ; // 1МА По цене
extern int Period2= 50 ; //Период 2МА
extern ENUM_APPLIED_PRICE PRICE2= PRICE_MEDIAN ; // 2МА По цене
extern int Period3= 1000 ; //Период 3МА
extern ENUM_APPLIED_PRICE PRICE3= PRICE_MEDIAN ; // 3МА По цене
extern uint X= 1 ; // отклонение от ма, пунктов
extern bool PlaySound = false ;
extern int M= 1000 ; // миллисекунды в Sleep
extern int R; // раз повторения музыки
extern int count= 0 ;
extern int Step= 500 ; // счетчик тиков 500макс.
int i; // исходный счетчик ордеров
int p= 0 ; // внутренняя для playSound
bool y = false ; // для удобства сравнений условий 1,2,3,4,5,6
bool dummy; // для выхода функций в переменную
int ticket = 0 ; // тикет открываемого ордера
int Magic= 222 ;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick ()
{
{
if ( Bars < 801 || ( IsTradeAllowed ()== false )) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
return ;
}
//+----------------------------------------------------------------
double ma1= NormalizeDouble ( iMA ( NULL , 0 ,Period1, 0 , MODE_SMA ,PRICE1, 0 ), 5 );
double ma2= NormalizeDouble ( iMA ( NULL , 0 ,Period2, 0 , MODE_SMA ,PRICE1, 0 ), 5 ); //три заданных параметра ма
double ma3= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE1, 0 ), 5 );
//+----------------------------------------------------------------- Открытие ордеров
//+----Купить
{
if ( MathAbs ( Bid -ma3)< 1000 * Point () && (myOrdersTotal()== false ))
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray ); //+------отправка 1 ордера
HLineCreate( 0 , "buy" , 0 ,FindLastOrderOpenPrice(), clrAzure , STYLE_DASHDOT , 3 );
}
else if (( Ask >=(FindLastOrderOpenPrice()+(Step* _Point ))) && myOrdersTotal()) //+------------если ордер в плюс
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
}
else if (( Ask <=(FindLastOrderOpenPrice()-(Step* _Point ))) && myOrdersTotal()) //+------------если ордер вплюс
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
}
else if (ticket== 0 )
{
return ;
}
/*
//+----Продать
if(MathAbs(Bid-ma3)>1000*Point() && (myOrdersTotal()==false))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);//+------отправка 1 ордера
HLineCreate1();
}
else if ((Ask>=(FindLastOrderOpenPrice()+(Step*_Point)))&& myOrdersTotal())//+------------если ордер в минус
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
HLineMove1();
}
else if ((Ask<=(FindLastOrderOpenPrice()-(Step*_Point)))&& myOrdersTotal())//+------------если ордер вплюс
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
HLineMove1();
}
else if(ticket==0)
{
return;
} */
}
//+------------------------------------------------------------------Условия
if (Uslovie1== true ) //Bid+ma800
{
if (( Bid >=ma3-X* Point && Bid <ma3) || ( Bid <=ma3+X* Point && Bid >ma3))
{
{y= true ;}
}
}
//+------------------------------------------------------------------закрыть покупки или продажи
if ((y== true ) && (myOrdersTotal()== true )) //продажа
{
dummy=( OrderClose ( OrderTicket (), OrderLots (), Ask , 0 ,White));
}
if ((y== true ) && (myOrdersTotal()== false ))
{
dummy= false ;
HLineDelete( 0 , "buy" );
// ExpertRemove();
}
}
//+------------------------------------------------------------------+
bool myOrdersTotal() //если ордера есть
{
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров
{
if ((( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))== true ) && OrderSymbol ()== Symbol () && ( OrderType ()< 2 ))
{
return true ;
}
}
return false ;
}
//-------------------------------------------------------------------
double FindLastOrderOpenPrice()
{
double oldorderopenprice= 0 ;
int oldticket= 0 ;
ticket= 0 ;
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) // цикл будет работать пока не останется ордеров
{
if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic)
&& ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ))
{
oldticket= OrderTicket ();
if (oldticket>=ticket)
{
ticket=oldticket;
oldorderopenprice= OrderOpenPrice ();
}
}
}
return (oldorderopenprice);
}
//-------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Создает горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineCreate( const long chart_ID= 0 , // ID графика
const string name= "HLine" , // имя линии
const int sub_window= 0 , // номер подокна
double price= 0 , // цена линии
const color clr= clrRed , // цвет линии
const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
const int width= 1 , // толщина линии
const bool back= false , // на заднем плане
const bool selection= true , // выделить для перемещений
const bool hidden= true , // скрыт в списке объектов
const long z_order= 0 ) // приоритет на нажатие мышью
{
//--- если цена не задана, то установим ее на уровне текущей цены Bid
if (!price)
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
ResetLastError ();
//--- создадим горизонтальную линию
if ( ObjectFind (chart_ID,name)!=sub_window)
{
if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price))
{
Print ( __FUNCTION__ ,
": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
}
//--- установим цвет линии
ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии |
//+------------------------------------------------------------------+
bool HLineMove( const long chart_ID= 0 , // ID графика
const string name= "HLine" , // имя линии
double price= 0 ) // цена линии
{
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
if (!price)
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
ResetLastError ();
//--- переместим горизонтальную линию
if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
if (! ObjectMove (chart_ID,name, 0 , 0 ,price))
{
Print ( __FUNCTION__ ,
": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию |
//+------------------------------------------------------------------+
bool HLineDelete( const long chart_ID= 0 , // ID графика
const string name= "HLine" ) // имя линии
{
//--- сбросим значение ошибки
ResetLastError ();
//--- удалим горизонтальную линию
if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
if (! ObjectDelete (chart_ID,name))
{
Print ( __FUNCTION__ ,
": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ());
return ( false );
}
//--- успешное выполнение
return ( true );
}
//+------------------------------------------------------------------+
...
Ok, ho capito.
Capisco che tutto ciò è tutt'altro che accettabile al momento, ma potete mostrarmi perché non posso ottenere unalinea tratteggiata di un colore specificato nel caso di un acquisto, anche se bianca o verde semplice darà facilmente fuori.
e
doppio OP = 5.00000
TP = (OP/100);
Stampa("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0,5
Non capisco da quando si divide 5 per 100 è 0,5
Non so perché non riesci a dividerlo bene, per me funziona tutto
{
//---
double OP = 5.00000;
double TP = OP/100;
Print("TP= ",TP);
}
Risultato
2017.02.10 06:22:48.663 test USDCHF,H1: initialized
2017.02.10 06:22:48.663 test USDCHF,H1: TP= 0.05
2017.02.10 06:22:48.663 test USDCHF,H1: uninit reason 0
2017.02.10 06:22:48.663 Script test USDCHF,H1: removed
...
Non so perché non puoi dividerlo bene, per me è tutto divisibile
Salve.
Aiutami con una domanda.
Sto modificando un ordine pendente cambiando il prezzo di apertura. Richiesta di un nuovo prezzo aperto dopo un cambiamento riuscito. La risposta dà a il vecchio, precedente prezzo . In qual è il problema?
Codice:
modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);
se(modify==true)
{
Print("L'ordine BUYSTOP modifica OrderOpenPrice() : ",OrderOpenPrice());
}
E voce di registro :
modifica #1 comprare stop 1.00 GBPUSD a 1.60150 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6028
modifica #1 comprare stop 1.00 GBPUSD a 1.60070 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6015
Salve.
Aiutami con una domanda.
Sto modificando un ordine pendente cambiando il prezzo di apertura. Richiesta di un nuovo prezzo aperto dopo un cambiamento riuscito. La risposta dà a il vecchio, precedente prezzo . In qual è il problema?
Codice:
modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);
se(modify==true)
{
Print("L'ordine BUYSTOP modifica OrderOpenPrice() : ",OrderOpenPrice());
}
E voce di registro :
modifica #1 comprare stop 1.00 GBPUSD a 1.60150 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6028
modifica #1 comprare stop 1.00 GBPUSD a 1.60070 sl: 1.59590 tp: 1.63464 ok
Ordine BUYSTOP modificare OrderOpenPrice() : 1.6015
OrderOpenPrice() memorizza il prezzo che era presente quando OrderSelect() è stato applicato. Il valore non cambierà da solo, in nessun modo. Dovremmo chiamare nuovamente OrderSelect() dopo aver modificato l'ordine.
Per favore, aiutatemi!
L'obiettivo è quello di tagliare gli zeri (altri numeri) dalla matrice, mantenendo la sequenza dei numeri nella matrice
Ho fatto questo codice, ma l'array viene sovrascritto - c'è qualcosa che non va - per favore consigliatemi cosa c'è di sbagliato.
//| Test_MassivObrez.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
int massivSize=19; //размер массива
double summDelta[19]=
{
0,
20,
30,
0,
0,
51,
0,
53,
54,
60,
70,
80,
120,
150,
0,
210,
223,
232,
250,
0
};
int SizeMass=ArraySize(summDelta);//Узнаем размер массива
int CalcZrero=0;
for(int i=0;i<SizeMass;i++)
{
Print ("Число на проверку=",summDelta[i], " цикл ",i);
if (summDelta[i]!=0)
{
Print ("Число до исключения нуля=",summDelta[i], " цикл ",i);
for(int i=0;i<SizeMass;i++) printf("Состав массива до исключения нуля summDelta[%d] = %G",i,summDelta[i]);
ArrayCopy(summDelta,summDelta,i-CalcZrero,i);
Print ("Число после исключения нуля=",summDelta[i-CalcZrero], " цикл ",i);
for(int i=0;i<SizeMass;i++) printf("Состав массива после исключения нуля summDelta[%d] = %G",i,summDelta[i]);
}
else CalcZrero++;
}
for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля summDelta[%d] = %G",i,summDelta[i]);
ArrayResize(summDelta,SizeMass-CalcZrero,0);
SizeMass=ArraySize(summDelta);//Узнаем новый размер массива
for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля и обрезания summDelta[%d] = %G",i,summDelta[i]);
}
//+------------------------------------------------------------------+
Per favore, aiutatemi!
L'obiettivo è quello di tagliare gli zeri (altri numeri) dalla matrice, mantenendo la sequenza dei numeri nella matrice
Ho fatto questo codice, ma l'array viene sovrascritto - c'è qualcosa che non va - per favore consigliatemi cosa c'è di sbagliato.
//| Test_MassivObrez.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
Io farei quanto segue:
double ResummDelta[]; // создадим новый массив
double summDelta[]=
{
0,
20,
30,
0,
0,
51,
0,
53,
54,
60,
70,
80,
120,
150,
0,
210,
223,
232,
250,
0
};
for(int i=0;i<ArraySize(summDelta);i++) {
if(summDelta[i]!=0) {
n++;
ArrayResize(ResummDelta,n+1);
ResummDelta[n]=summDelta[i];
}
}
// Print( ArraySize(summDelta)," = ",ArraySize(ResummDelta) );//Узнаем новый размер массива
Per favore, aiutatemi!
L'obiettivo è quello di tagliare gli zeri (altri numeri) dalla matrice, pur mantenendo la sequenza dei numeri nella matrice
Ho fatto questo codice, ma l'array viene sovrascritto - c'è qualcosa che non va - per favore consigliatemi cosa c'è di sbagliato.
A colpo d'occhio, l'avrei fatto in modo diverso.
double b[ 20 ];
//--- Проверяем массив а на наличие 0 значений
int j = 0;
for( int i = 0; i < 20; i++ )
{
if( a[ i ] != 0 )
{
b[ j ] = a[ i ];
j++;
}
}
//--- Изменяем размер массива а на значение j
//--- Копируем массив b в массив a
Sì, c'è anche una questione di correttezza nel confrontare i numeri reali con 0 con questo metodo.
Sto pensando a un compito come questo, non l'ho provato nella vita reale, dovrei farlo o no. O indicare altre opzioni.
Supponiamo che io abbia un segnale - in caso di forte allargamento dello spread (su notizie)
chiudere tutte le operazioni in corso
Ma gli ordini non saranno dati solo per chiudere o aprire durante le notizie
Quindi, se prendiamo un comando, diciamo OrderClose, lo mettiamo in un ciclo e lo eseguiamo finché non si chiude (in modo simile a OrderSend) e altri comandi che possono terminare senza successo