Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 119
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
OK j'ai compris
Je comprends que pour le moment tout cela est loin d'être une forme acceptable, mais on peut montrer pourquoi, dans le cas d'un achat, je ne peux pas obtenir une ligne pointillée donnée de la couleur spécifiée, même si elle donnera calmement du blanc ou tout simplement vert.
Hé bien
double OP = 5.00000
TP = (OP/100);
Imprimer("TP= ",TP);
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1 : TP= 0,5
Je ne comprends pas car quand diviser 5 par 100 sera 0,5
J'ai posté le code corrigé pour vous, comme il se doit
//| 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, j'ai compris.
Je comprends que tout cela est loin d'être acceptable pour le moment, mais pouvez-vous me montrer pourquoi je ne peux pas obtenir uneligne pointillée donnée d'une couleur spécifique dans le cas d'un achat, alors que le blanc ou le vert uni s'imposera facilement.
et
double OP = 5.00000
TP = (OP/100) ;
Print("TP= ",TP) ;
2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1 : TP= 0.5
Je ne comprends pas depuis quand tu divises 5 par 100, ça fait 0,5.
Je ne sais pas pourquoi vous ne pouvez pas le diviser correctement, tout fonctionne pour moi.
{
//---
double OP = 5.00000;
double TP = OP/100;
Print("TP= ",TP);
}
Résultat
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
...
Je ne sais pas pourquoi tu ne peux pas le diviser correctement, c'est tout à fait divisible pour moi.
Bonjour.
Aidez-moi à répondre à une question.
Je modifie un ordre en attente en changeant le prix d'ouverture. Demande d'un nouveau prix ouvert après un changement réussi. La réponse donne à l'ancien prix précédent . Dans , quel est le problème de ?
Code :
modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue) ;
si(modifier==vrai)
{
Print("Ordre BUYSTOP modifier OrderOpenPrice() : ",OrderOpenPrice()) ;
}
Et l'entrée du journal :
modifier #1 achat stop 1.00 GBPUSD à 1.60150 sl : 1.59590 tp : 1.63464 ok
Ordre BUYSTOP modifier OrderOpenPrice() : 1.6028
modifier #1 achat stop 1.00 GBPUSD à 1.60070 sl : 1.59590 tp : 1.63464 ok
Ordre BUYSTOP modifier OrderOpenPrice() : 1.6015
Bonjour.
Aidez-moi à répondre à une question.
Je modifie un ordre en attente en changeant le prix d'ouverture. Demande d'un nouveau prix ouvert après un changement réussi. La réponse donne à l'ancien prix précédent . Dans , quel est le problème de ?
Code :
modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue) ;
si(modifier==vrai)
{
Print("Ordre BUYSTOP modifier OrderOpenPrice() : ",OrderOpenPrice()) ;
}
Et l'entrée du journal :
modifier #1 achat stop 1.00 GBPUSD à 1.60150 sl : 1.59590 tp : 1.63464 ok
Ordre BUYSTOP modifier OrderOpenPrice() : 1.6028
modifier #1 achat stop 1.00 GBPUSD à 1.60070 sl : 1.59590 tp : 1.63464 ok
Ordre BUYSTOP modifier OrderOpenPrice() : 1.6015
OrderOpenPrice() enregistre le prix qui était présent lorsque OrderSelect() a été appliqué. La valeur ne changera pas d'elle-même, c'est impossible. Nous devrions appeler OrderSelect() à nouveau après avoir modifié la commande.
Aidez-moi !
Le but est de supprimer les zéros (autres nombres) du tableau, tout en conservant la séquence des nombres dans le tableau.
J'ai fait ce code, mais le tableau est écrasé - quelque chose ne va pas - veuillez me dire ce qui ne va pas.
//| 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]);
}
//+------------------------------------------------------------------+
Aidez-moi !
L'objectif est de supprimer les zéros (autres nombres) du tableau, tout en conservant la séquence des nombres dans le tableau.
J'ai fait ce code, mais le tableau est écrasé - quelque chose ne va pas - veuillez me dire ce qui ne va pas.
//| Test_MassivObrez.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
Je ferais ce qui suit :
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) );//Узнаем новый размер массива
Aidez-moi !
Le but est de supprimer les zéros (autres nombres) du tableau, tout en conservant la séquence des nombres dans le tableau.
J'ai fait ce code, mais le tableau est écrasé - quelque chose ne va pas - veuillez me dire ce qui ne va pas.
À première vue, j'aurais procédé d'une manière différente.
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
Oui, il y a aussi la question de l'exactitude de la comparaison des nombres réels avec 0 par cette méthode.
Je pense à une tâche comme celle-ci, je ne l'ai pas testée dans la vie réelle, dois-je la faire ou non. Ou indiquez d'autres options.
Supposons que j'ai un signal - en cas de forte augmentation de l'écart (sur des nouvelles)
fermer toutes les transactions en cours
Mais les ordres ne seront pas donnés de fermer ou d'ouvrir pendant le journal.
Par conséquent, si nous prenons une commande, disons, OrderClose, la plaçons dans une boucle et l'exécutons jusqu'à ce qu'elle se ferme (de la même manière que OrderSend) et d'autres commandes qui peuvent se terminer sans succès