1011010100101010001111100100011101101110001101101101111000010001101111101001011110100111100111011001001000101110001101110100011001001010010100010001101001010110011101010111011111111011011100110101111010101010111110101101101100000000010100100001111001001100110101101011110101011001010000001111010111100001110000101100001010000010100110001110011100010000110111100100111110010001001110100010000011101100 0010110110001001001001110100000101000000001101100011111011001001010101110101011110111011110001101010110001011011100000010010001101101110010011001001001101011100101010010010111001010111101010011111011001110011101001010100011110010111101011111010110000100101100110000101001101101001110111011110010011010110101000010010011001000110100010000000001100101011111100001011001000110000100001011010100001000011 0100100100111001001010011011011010101110100001100111011001100011111000010011111101010001111000001110110010010101110100010111100110011000000011100000000011110010010001010000010101101001000011000100111011111001011101000010001100011111011100100010111100000011111100110110000011111100100110011010001010110010101100010001001000001110100000010001010001110110110000111010111111101001101011101010111110111100 0111000000111111011011010011111110001110101101110011000001100001010001110110101110011100010100101001110110110000110010011100001010011010110101110101000110001100000010110110110100100010111010011010101010010111101011110001111000010001100101100001110101101000010011111110001010001011010001010111100110001001011010111110011010101100010011101000000110010011000001011011110000101001011010010100011001110111 1111000000101000010010011000110100010101000100100010011011111001001011011011011111000101110110011001000110100011110101110000100101011101110100011111010000010101001111101110100010100000001011110010010110110000111111001100110011101010111011010101000110000010001001011011100101111001110001101011101110011001011011101111000101001011101000110010010010010101101011110100011000010100000111001110010011011010 0001101001001010100001111001011100101110001110000110011011110011110010000001010000111111010000000001111110100000010101111101000001100111010000011000110100101111100110101011001100100000001000010110111110100101010011010000100101110111100001000110010011001110010101000001000111000110101000000100011011011001111011111100000010001000110110111001100010010110011010101001111010110101110100110110110001100001 0111010000110001011100001011100001110000011001100001001101010011100111100000110000011011110011100110000011111010101011110000001000100010010000000111010101110000011101001010100011100000100101101000001111111111101011111101011011000101010001001011101101000000001111110110110011111100110001011000001001100001011101101010110000011010110100011010100111111011101010100010011001100011001001101111001100011001 0010100010101101000011011100011110110011110010100100111000001000011000010100010101100000100011010000111100000101100001000100000000010001110100000010110101101000101000000101111010001101011111110010001011111110101111001101101100110011010001001110001000100111100010010101111100110000101111100010000101010111111110110001111000111101100100101000100011001111100001000001001101010011100010101101111010001111 1011111111110010010101111000000001100110100000100001011111100100111011111111001110001110010010111110100000010101100101100100101111101110001100100000011111110111001011000100010011001000110011010000011100100111110000111111111000000101010000010110001101010000011100011100000111101111000101000011001100111010111110101100000100100101010111011110101101100110110001100000000011111110111110101100010011001111 0101011001001010010110101001010101001100011001001101011011010000000010001101111101000101010111111100010100100101000010100001100110111010110011010000110101101011001010010010111000010000001100011010000010111100111100011000000110101101000000110111010000001101010100101101001100111101111110100111100100011110111100110000011101011010110011111001110011110111100011111010011001110110001111011101001010011000 0000111110011100101101010011000101010001000101011101001101011101101000010001111100101100101101001110001000110111010000110000110101000100001111001111110011000000111000010101100000111111100010110110011111111100111100010100000111010111001111010110101111011010001010100000000011001110110000000011101001010110100100110110010111011110100011011101101111000111000000100011101010011101101010110100011001100001 1001010100010111111101110001010111111101110000000110100010100111001010100111111010100010010011000110010110010000000000100000111001010100010110110011101100010111100101011001111110101010101010101010110000011100101100010100111001111101111100001101011000101100100001110100000110010100100111001110001011000001001101010000001011111001111111001100001101110101011110100000101001000110110111110101110101010010 0010100101000100110100110011101000100101010100110111001111001010000101001100010110101000000111101001001101011101111110110011110000100000101010010000011001101110010011001001000100000001110001100110000101001011100001110100011000011010100111110000111000110001101100011011101100100011000110110001101001111000110100001010110010101001100000110101011011101010000110000111111000011001110011000011100000010011 0101000111110111000111001100111010001011011001000100101110011110010100010010011011111111111001111011001101111000111001110111110001001110010110000100111010000010010110001101111101110110110000000010010101011100011001001000111101010101111111010010000000011111011101001010100010101110110001100001010001110111110011011111101011100010001001000001100111000011111101000001101001010101111110001100010110111000 0110001101001101111101101101101001101100010000001011011000001000010011000101111100101111111000110001000000100011011110100101111001110010111000011011000101011110011101000111010010010101000010111110010001010010011110111010111100010100101100110111010111000000101111100001100101000001011110110100100101001110100011011010001101111110111001000110100011110001101110001000001101101101011011001011010111001011 0110001001011100000100011111001110000001001110000011110111100100001111000010111100001000011101001001110110010110010010000011011010000010000000110000100001101000111100011100111001100100101010000110111100110011101110100010000010010111011011001110010000111101011010011000000101000010011101010010110000111010111001000010101001100010101101000000111001100100111110000101100011111011100110110010111100001100 0101111101110010010101011010001111101011111111000110111100110010000101100100110111010100100111100101000011011001101100101111101010101101111111110101110111000001100100001110101100110111101000011101010111001001001101000001100100001100100101010100100111000111110001110010011001010110001011011110010100100100001000111000111101001100110001010101111010111011101001001110111010000000101011011100101100100000 0001000011111110011111111000111001100010101101101000000111001100010111001111011010010011100101100111100110011100100010100111111010000100010101010100001001101001011010111100001111101011011000100110001111101011110001101001100100100011110110101000011111100000000001111100100010110010101011101010110100101111000111111100000000001010110101000001000000001110011111110001111100101111111001000000111000110111 0101101111011100011101001110000011111110000010100010001111000111111110111011000101110011100110011101111111001101100110110010010101110000000000110111011110110100000100111001011100111110011111011011011000110011110011001100001101100010110110010110010000101100111111110000001010111101101111000010010001101000011000001011100110101100101110010010110110001001110101110100001101101101110010111010111100011010 1000010110111111111000010101110001111111100010101111111011100111101101011011000000010001111101000000111001010101111000100010010110001101101101110111111010001001011110001010111111111100001000100011000000111100010001101110101010111100001111110110011001100000000100011000110110101111110011000111011011010001111010011000011100111010010100010111110110001110010000101110011000000000001111001011110111101001 1111011010010001110001110001001111100011011111111011011001011110010100101010011110000011111011110101000101011010101011101011111011110110001001110111000010000010111000100110101110101111110010100100101100001111100110100111100111000100011001101011100110110011101100111001100101011010101011010110111110010100111100000100001011101011111100011011000010010001001110111111010001110101010101111110100101111001 1001010111011111111000100101110101111110101100001101011000111010100001001011001110001000010011011111011010100000110001100000111100011110011001100000111010001011111100110101010101110110011000001001101010011100100011001101000000001000000010010101011110110101111010001101101100000010100000011100110100000001011011110101100000111011111010101001001110000101101001011000100100101111101110110011011111101101 0101100011110110011110011110010001000111010111110010110000100001100101111111000101110110011100010011001011010101110010000111010010110101001011110000101100100000111001010110000110001010111100001111100000010110100101100100111011110001101111110010110110011001000000000101100110111110110001000101101010101011111110101001101001101110001001111111111001000110000100101000010001111011010101110110101011001001 0011001001011000000000110100101001000010101100110001001110000011000100101001100000010011010001111010111111101100000010111011100010000111001010100101001000001010010011000110111111000101100010100000101000011001000101111101011000100011111000110101011101001000011110111011111111111111010110110001011111001000110111110110010101101101001110111001001111100101010000100000111100010001101111111011100110001111 1000101000110010111011101111100100001110010111010000111000111010100000111011100000111111101001011001100111101010101111111001111011001001111010011100110101100011011000111010110010110100000100011001101011000101011010111101010001111000111001111011110011000101110001000110110010110101010101000000000011000101001110110010010001010000000010110010010001010110011000001010011110010001110011010100110110001001 1100011110010010110110101110000010010001000011001011010110000001010100010000111111101110000000010001001101010101010101100001010011111100000100100010101010100010000100111111101101110010101011100001101000110111011110110110111101010001011110000000000001000101000110001110000010001011111001001110110110100110000001011011011100101001000110111101010001101101101000000001110101001010101110110011111101000100 0000101010000010001000110110011110011001101110101100011101111111110100110111001000010000001001110110010001101011111001101011011110011110111010001110111111100101001010001010010010101110011100001010001011011011010001011101100110000000011111101011011101100100111001101111000001101100000110011011110010000110001100011101001000110011111001110001010001111000010100010001000001100011110101110011011001000011 1111000111010101111111100011110000001100010100110101110111010111010000101000010110010001111110100010100110010100101000101101000000111100000001110001001001111100011000010000001101011100101111000100101100001001101011010010001010000000101011011011001111010010000101000000001010100100101011001110110001001010010100011101001000011011100011001100001011100001101111111000011011111000100100100011001001101000 0100110010110011100101111010001111110000111101010100111110111111100111010111110001111000011100011010100101111111110000010110001001001111101111110101000010000110101010100001001001111010011100110100011011111101101110011000010100100101010111011000011000101111001101010000110110111111000110101110110111111011011110000000111001001110111011011011111010000111011011110101011000111000000100000100100101101101 0010101000100101001101111011111100001101100000110110010110111110111000000101100100010111101000110011011101110011000111011011001110101011111100011011011011010101101110010110010110000111110011100110100110000111001011000010011011010100011011000010110011000100001111011110100011101011110101000100100100110010010100101111110001100001111101000110100001010110000010110010101011000101011010100000111000010000 0100101111100100101001010010010000001011100010100011101111111011000001110111000111011111001101100100000000111100101000100100000101100110011011100001101001111100000110010001000101011000010100100001000010110111101001100110011001110010000100001011101110101010001111100000110010111011011111101100001010011110100111101111001001001011010101000110010111101011110011010100010111000101100100011110000000000100 1111110101100110100010010111001011111110000100111010011100101000001111101100110111001011010110101100011100100110100100101111001000001100010110000000001011100010010110001100101010000000011010000101010110100101110100011000000100010010111000011100110001010101011100010110111101011010000101111110000001110010101101000110010000010100111110000110010001101110100000011011000011110001011110101011011101001000 0101011100011000101011100000100000010011101110110010100101010001000111000010100111101010110000111010100010101111000100101011111001100101011010010100001110000000100010010011010001000011111010101111101110110001000001000011001001000011000000000001100000010010000110100101111110001010110000001101101011111000010100000001100000110101111000011100010001111101000011001111000000010110100101110001111010111011 1101001100100100010101000000100101011110000110110000100011111111100011001011011000110101101011101110110101100011101111100111001100000101111100011100101110011010111101101000001000001110101101100010111010100101000000100011110001000110010101110111011101011101101110110111100011000000010010000111100010000110011001110010110111010100110110110101010001000010101000000101011011010110111111101000011010110110 1000110010100111111111010000001010010101111100001100101001100100110110101010010010010010011000011110010111011101100100000000000101000000101110010011000011110010010000010000011101101100110101000000100110110001111010011110101101111001001001000001010000101000110110000111001010100000001001011101010010101110110100100001000001110010111111011001010011101000011101101000100011100110001100011010101011000111 0100111110100010000011011100001100100111100011111001110111010001101101110011010011110111011001001101110111100001011010001011110001000110011110111011011101011111101111011000111001101101111001101111011011101100000001111110100011111000000000100101100011101001110010010110101101101010111110110010101110111101010000100110010101001011001100101101011011000100101010100000010110010001110001010010110101001000 1101110000010001010001100111101000001100001110110101110000110111010101011111110010111001010100001111000101010100110100110110001000010111100011101011100011001011101001100011101010111010000010111101111110100100110000011111000011010110001000111110011110000010101101111110110111010010110100011111101001101000100101010000100101110100000011011101101100000100100111000010000111111000010000111111111010001110 1110111010011001011100101011111101110000110100011100101000001110010000010001110010010001011111011100001101110101001011011111111100001110001101001110010001111111110000000000100110011010001010001110010100000100000000011011000000000110011100101110010010110101000100100110000010000010000101111100000101011110100101010101100101011010000111011110001100100101000010010101001010100001110111100000100001111000 1010010010001100101100000100110100010001000111100010101101001010000101000100110101111010000101111011101001010110100011011101101111111000010111010001110101101011101000101100100010001011110010101011110111010010010110010110111000100000010010011110010010101100101000001001001001000010001011101001011001101000010111110011110011101110100110011110110000110100110011100100001110111011001010111101001100001111 1111001001111001110000110010001100011001111111100100100010010001001100011100100011010011010011110100011111100101000011001000010001011010111100000110001001000010110101100010101010001100011111101000100111110100000100000011001111111110110110110110111010101001101000011110010100000111010111100101000010101010001101001000010110000110111011101110000001000111100110000001000111111001111011000001111011010001 1110001000000011110000000101011111001100111010011110001000100101010001000011010011011011101101001100111100110101110010110011011101010010111111000101101001111100011101011100111100100110000001010000110110010011101000000111110010100110111001110001000000111111111110100010111010111010110111001001011000010011101001110110010001101110100100101100100100110000000101111111011000001110100110001100101010010000 0101111110100101110000110110010100010000010101010001010111111110001000101110110011100100011001100011110101100011101010000100011011000110000010101101110101100000001100100000100001110100101000101110000101001100111011001001001110111111011111011000110100100100010101100100001111111110111100111010110101101000110001101110011000000101001010111010011001000011010011110001010010001001010001111001101011010010 1110011010001010110011111100111111000100110000011011000110100010110101011100100100100110101101100001000011010000111001000010100000111001010000001000101111100100100000110101011111000010111010110011000100000111100000100001100000000101101110101001111101001000011000010011111101000001100011011111001010100101101111001000100100011011011010000010000000010001010001100111111001101111111111101011100010001011 0011001101011001111001001001100110111001101001110010101001110011111000111010011110001000100111110011011100000110101100000111001001101100101111000111100010111000010101010101000010011111000111010010100100111000101100011011111011111011110011010000000111100110010111111110110110111111000001100110001101001000010010001110111110001100000110101010000011001100100010001010101100001100100010110111000111011011 0101101110001001100111011010110101110101111111011010001100010110110001110000101010111111001011000010000011001000101000100001101000000111111110001100011010110011111110000101000000110001111111000011110011010111110100001011101011001110010100110111000101001110110110100000000001111010000111100110000000110100010111111100110001111100111001010000111010011111100001110110110010101000000111111101111001000011 0100000011011000010011000101110100101111110100000101110000011010011000101000110100001001000001110001001011011101001001000101111100110010000000101000111010011110101111001101011100001010101001010010011100101001011111111101010110101011011000100101111100111011000001001010101000000101001100101000001010011010001110001001111100110011001101011010001011111100011001110110001011111110011001010100010110101001 0010110011000101001010101111010101100001010101000110010001001111100010000110100110111011110010101100110110011111111010100100100111011001010011110100111110100110011110001111101100001110111000010101001001000110011101110110011101100101111111010010110010100000010001100100101101111100000101011000001110010010001100010010001111101101010111000100100000101100000011000110010011010101101101010100100001010011 0011001100000011011110000001000110101011011110110110001001001011001101100000100011010110100101100111100110011001011001111011000000011011011000111110100011110110001101011000001110100100101100111000011011010001010101000001110100001001101110000011101101001011010111101111000101100101100110110001101110011101001000100110001110010111101101100010110010011111100000010011010001110110110101010001101110000010 0110010001000110010101010000110110100010100000001011111111001001001110100000011101001110011001010001110101101011001001001100110010011100001011010110011110010011101000110011101101110001110100110001100001111010010110000100101100111110001100100110111010100001111110110000011010110010011111010110111011011100011101010110110010000101101100111101111010011111101111000101110111101001011101111001001011011010 0100010111000101011010011101010011110011101101011000011011000000110001001111000100001100011111011111011010011110000001111111011100111110000000110110101011100110011011001001010100010001010001100000010110001010110011111100111111100111001111000001111000010010000101111000001001110011100111111100110110011111100111100101100011011010010010011010100011000001110010110111011010000001011101101110000011100001 0110101111111110111110110111000110000011001010010001000000001010010011011001010100111010011111110111111011011010110001001001011011011110000100011011100000010111000111110110101100001010101001010011111000100010000100100101000011110001111011101001000010101010100001110010000101111000111010001111110101001101001000001100010000011101110011000010010100001101001110111110000100011010010111000101100100000000 0001101010101110010100001111011011100110101001001101011001000001100110110100010101000010110001110101001001011110001111110110010000110011001101111010010010111110000011010000110101010101001000111110001000101100010011001111111101010000011010110110111010001111101110111010001000000101011011101100000111100111010001000110101101111100111001100011011101011011011100100110110110111110010010100010000011100110 0000001000001000111010011000001110001100010000011111010100011100101101110010010010010100010011011100110011001111001000100101010011001010000100011010010011011101011111100000101100011010001100111101010100000110101110000101111000100100101011100111000101111110000101000010110110011001010110100100110000101101100100110011111111111101001010000011011010000110111001111101110000101001011001111010000000111001 1011010111111000101111111101111100010110011100101010110110010011001110010001110101110000010111010110001110001001111101010000110011001000101011111100110101100010110001111111011000001001001011111000100010010100010100000110011010111000011111110101100000101001010100101000000100000011000000100101101100100110101110011101110110010010111100100100100101001100111011100011111010111011110011011111011011011111 0111000100001011000000111001011111100110100001011110001101000000000111010110010111001100101011101010100100101110110000001011010111001000100101110001001100100010101101111110100000010110101011000011111010100101110010110100101010011011110101011001100000001011101000110110100010100110100111100111000001101111100011000100110101011001010101110111011100100001011111110110111001110100100101011100000001011111 1111101011100001000110100010110001000100001011100101100100000001011100101100110011001010111101011100010111111010100101000101000000101110111101101101011000100100001101000101011110000010000111011110001100000011101100101111100110010100110010011011111111000010011110010111010101010011010001001101110000001011000011101010100010111001110010101101000010100110001100101101100010111001000001111010100001101101 1010111111101001001001000011111000011100100101101011110100010010001011110100111010111011101100000011100111111010101111100000100010111110001010101100000101110111110001011011110101001100101001010101011100111001010000010100111111000101101101111011110010111101011110010001000001100010000010011101100011110010111000100011010001000001001101111110111010111101111110101001101101100011001111100111010010011010 0011000110000110101001101001000111100000100010111010000100000101100011010110001101011111011110111110101110010111100100010111001010010001011100010111000101111011101000100000010001010010111001100001110101011101110100110101111011010111010100111010000110010010001001111010100100001011111100111110000000000011000010011100100000000010011000001010010111001100000011001111011010110101111011010100100110110001 1111000001001100011101100000001011010000011010001001110110101001111000100110000111011100000101110001001110010110111110101111110100100000110001001010011000000100000111101100110000110111010001110101001110110100111100110100000101010101010001000001011101010111011000110011010001110011011010000100000101111010010011101110010010001111000100000100001011101111000101001011111010101101001101101111101000001000 1111001100001001111110110110000000010000100001001010101011011100000110010011000110110000001010001111010100000010011100001110101111100110111100110100100000011101101111111011000000001110110001011000100111011100000101000111111101001010110111100110011011011001011001000111110101101100110000111100011001000110001000110001100000100110001001011111110111101000111001100000100110010010001100101111011011000011 1000001111001010000101111000101000001110010000001010011011011111110011001000000000111101011001000000101000000101110001101001100000100110100001000101101101001010011111110010101111101000101010111010101100100110000010001111000101101111010001101111001110101001010001010111110100001111010001100001000100100001000110011011001101110011001001101111000001100100101100100000111010010010011110010110000011001100 1011110111100011100100001000000100010110110010101101101111111011001011110110011100101001101100010110011011000101001111110111101101001111101100101001010100011011110001110100101110011101110000110101101101000010010111001100000110100100010000011111001001011111001010101001100100111000000101110000010100001110110000001111100010010000000111011000001010000010110001000001001010011000111001110100100101111011 1100100000001000000101110000100000110100000001010100110001100111110100101010101100011011100100001100101110010101011100111001101100111010000111100110111101100011110010010000111001100100100100011001000101100000010100111000111011100010101110111000100011001011110100110001010101010100010011111111100011101100110010000110010011011010010100110100101011110001100000001101001110111100001100101100101011111110 0011110001100100011001111000100111001010000011001000010000110111001011000110111001111011111100011001001110100001110110010011100001011111010101011011000101111010110101001001101110011000010101010110011001010110011100010101110110101010011001001001000010010010000110111011001100011100100001000000001111110011101111101100010011001011010011101110001110001111111111010010110010011111011100010111100000100010 1101010010111010100101000010001111000011111011110101101100100010111000001110010001100110001110101001001000100101100011010111001000111111001011010001100110101111101110011000111011000111101100010001110110101001110010111000111101000110001011010100111100110001101101011100011010100010110011010001100001000011000101111011010111100100110101101111000101111111011101100010101001001101101000001011100011001001 1011101111000110101001110111010101110101001100011011000111011010100011101100011101110100111000101001011110001000010011110111110100100001110010001001110101000000111010001001010001001100000000000101010101101110000101110110011111101000001001010000101111000010100101100110000011110011100010110110011000011011011000110000111111010101100101100110101101100000110110101000110001101111000000111101111000101001 0001011100110001011000110000110010000011010100111100001100010101010111010110010000010010111000111111010011010010010111101011101001010001000000100010011110100010110100000011001000110101110100110111101100111011001110110110000011010110111010100110111110111100110000101001101110101101001101001000101100100001010001110101001100010010100101111011111111111100111000110001110111001100100011100110101000010000 0110001000010110000110001001101101001101101111000100111111110001101011100100011010100100000111000111001010010100011000111010111000010101110000000111101110011000100110001101010110010110100001011111000111001110010001101101100110100011111000111111000010110100111001111100010010000010110111110011000100110001001011001011010011100111010110101111110011101011110101000110101101111110010101000111101011000000 0011101110101011110000011101010101110001111100100100010111101101010011011101100001010000011111111001000010001000110001010101101111101010110100101111111101110010101001111110101101010101010101011001000111100000000001001100001000011101101011011110110100010010110010100010111000011111001110101110101110111110110100000000011111100000000111000110011001111100011010010001111100111110100110111110001101001101 1011101110011101101101011111011111010010011101100001111001000000100101100111001001010001001110000110011011100110101110010110010111110010001110110010001010100010100011111001011100001001110111000111110100001010000000101001010100100001000000001101000000010100111001011010001111010000111110000111000001011010101001001100100111001111000110010000000000111010000000001001110011001101001101111101110010111110 0100101101000011011001001011010101000001000100010100101001011101101110001110101101010111101100100111111111001100001010011110110100101010111101010101000011111110111000001100111011001101100111001010010101000110001010000000111000011110100100011000001011000101001100110001011100011100100011000011100101010111011100100010110010001101010101110011000000111100000110000111010100001001010101011001011010001100 1001110011111101011010011110111010010000110001110000100001000100110011101000000011010011010000000101010010100010110000111011011111010011100000010101001111000011010101111001000110110000000001001010001011111011000001000001001111000001000000000011010110111001001010001110011100011100110001011011110001110010001011110110011010111111110010010111000111100000000100001000000011010110000011110101000000101000 1110110010010100001000010100000011101011000110011100100101000101110100101111100100100000011111111011011011100001000110011110101110010101111010001101011100101100000110001001010000011011001100101101101111011110000000010110111000100110110110110110000000010101000000000101001011001000111000101001001010111111010100000000101110110110001001010101011001001000101101001101100101100001001100001101111010001100 0101101011100001011000100111100111100100011011010111011011011010111001101000100110111101111100011011010111011100100011011000000101100011000101110110000100101001011010111011110010100101101011010100010010011000000000010100101100110010101110011010110011111110111000010101011110111101100111011010000101010000011100011011100010110110111110011010111010111110110001110110100111111010000000011000000111000010 0100000100110001001100001101000011000001000001011100000111000011011110110010011111011000010000001010001111001010010100111001010000110101101001001101000000011101000000010001111000011010010100100100000110011011010111011101000110111010011001000111110011000011001100000011101111000111111001100111011011010100100101110001001000010010111001101110010101111100100110101010011010101101100111110100001010100110 0111101100010100101101100010001101011100101100110100110111110101101001001110101101010010110101100001010001110000111001011000101000110000111000101011011110010111011110000011001100101111100001111011111111101100000100010110000010011011111011100100001110011110111001111011101001111011111111101001011111110101011011111100100100000001111111100111111010011001101100011010111101001010101111000001000011101110 1100001101100010111111101000001010010110000110011010101111101100111011011000101111001101101100111100101010010100110010110011101011110100010010010110100010111100010001110000100110100101110101111110000101100000011011110010011011000110110111001100100111100010011000110101111111111111011010100001100100011110110010100011101001000101000010000010010100111111100111000101010101001001100001110000110001101101 1011100010111010000011000111111000110110000011010111111110010100111110100100100110001000100000110011010011010010000000000000111010010010000010101001011111100101110010001010111101111110101100110011001110110111010001011111001011101011001101100011000011000000011111010010000010001100000010100000111110100000111110100000001110100100010110001000000100000110011111110101000111100011010011011101011110111001 0000101110110111110101011100011100100000000010010010110101110011111110101101010010111111011011001111010001101010010101001001010111001110000000111101110000111011100100000001101010010100011000000110111000101101101000000011010111001001111110111111100001000101110001010000011100000101001001100100100101111111110110110101110000111100111000101010011000110111001001001111111100101011010001010111101100111101 0000111001001000101000101011001010110010100011010001000000011101010110010001111011110000001010101001110010111010111011011001010010101010011011111110010000110011100000100110101001011010110010010001100000101110101101101101100101111010101011110000110101100110100010111010100010101001111111010101011011101001010010110110011111101100110001110111111110100011010111111011001110110111000010000100101111111011 0011010110001000111110000101110110111001110001001100011010111100100011001001011001111111110010011010101001010010100100010011101010100011011111101000111100010100011000010111000110100001010100100010111101110101101001101001111100110010011000010001011110110000011010100011000001111100000000000000000110010110001100000001010110011000011100111001110000101001000111001011001010001001011010010101011101001001 1111110111000010101000000011101101110001101001101100001010111101101001101010010111101111100110101010000010000110001000010111000000001110100110010001111100110110101110001010101111111110010011101010101011011101111100011011011011000110000000101011011000111101101110010010111110001000011011000101011001010111010010011100100010110010011110100011110010010101100100000010111101001010001100011011001100010111 1001101000011000001011111110100001111111010011001101011111100110101011111111111010111110100111110010011011110011110001001100110011110100011101100000011110010101111001000000010010001011100101000101010110111111101000001100111010110101110001111011001100011111111101011110001010011011000011101100100000110100011110100100101100011111100011010100110111001000110010011100111100111011101001100011110100000010 1110101000101111110111011100110111001100100010111001000100110001000111001110100011110110101100010011100011111000010000111111010101111010001101011100101111101001001111010101000110111000001100001011000111010000011001011110010110111101010000011011110001011100111000011000100101010001100101010101000011111110001110101011110100000000110110000101011110101010100111001111110101111110100011000001111110001011 0111010111100011000000011001101101001000010011010101110101100000010001010100010101010001101010001100010110111001011011011100101011001010111101110001110110110100100010001000001101110000000100001011010001000010111010100011100101011100100111011101101011011000000000011000010110001000101011111110100000001000000010101110010111100011000101100101001011110011000000011110110110100001000111011110011010011101 0010101011101111000100011010100010010110111111100110111010000101011011010100000101011011110000110111010011110011010111001001000011000111110011110010101000111100101000010000110100100111100111111001010010011110100110101011000110011110111001000011101111100010001100101011001001111000111011010011111110101100011000010110011001101001101100011111011110010110100101010110011010000010100101111100111101010001 0101100011001011001100000100100111000001111111111011100001001110000001001001100110101000001101001100111111001110010101110010001111011010011100010101011001010000100111010100111101111111111000101000111110011001000111000011100001100001000010111011100001100001111001100000010101011100101010000110100000110101111000100111011001010000111010110111101100001111100000011110110000100000100101001111011101001110 0100101100100101101011100101010100010001011000011001001001110110000001111101111010100010101011111100110001011011100110110100011111001000110110101010111111011011101100010010111011100001111110111100111001110010111110100000110000110110111110000001111011101100000011010001101011000000011001110000010101100000110001010010000100000011001010110010100111110110110011101000011110010000001010111101011110010100 1011010001110011101011001011010111010010111010111111111101000111011000100110010101111010101011101100110011101100101001011000001010000011011011101111101001010101101000101100001000111001001000111111011001011010101111001110000100111011001001001001010010111001100101110001110001100011001100101101010101110011011111101100111010100011111101100101101101100000101111111011110101111101100100101000101110000010 0000011011001001111011001111100101100100000101001011000011111011000100001010110111001100000100111100100110010001011101001000101011001111101011100101000110001110101101111000100101011111110011111110001100000000100000010001011111101101100001100001001011010001001101101010010111001010101111011111110011111111111001010111000100010101001100010010110010100011001010010100011011100111110001111111000111011110 0001001010011100101001101011100000100011101011101110101110110100110011111011000001000110011010011010110110111001100011110111010111010110100011100000001101100111111101010100000110000100000001101001100100111100001101010110000111000110101110000010101111111101110000101010010100101011101111101011010001001011001110010100010111001100000100111111101010001010001000100110110100010100111101011110100000111001 1001100111000010001001111011000000011011011000101011100010001011110010101100010101101101101010000010101001100000101110110110001011001100100110111000011101100101001100110111011000110011111000111110101000110110011111100000111000100011100101000000101100111111000111010111010111001110110110100001010010000111000101011001010010101011100100100000010010011111111001110000001110111000111000000110100111101111 1111000001110101111101111011100011101100110101010010011010101100001100101110101010001101011101011100100010011011101011110111111110111110111011111100010111101100001011100101100000111111000100101001011010010000111101000101000110101100100000010001100111101100110100010011011001001011100001110011000110111010111100001000011111000010011101100010010001110010100000010001000100001011011110111110010010001100 0010011000011111001011000100011001011101000100010000100101011110011000111000101010001110111111100000011100100100110111101000001100010110110101101110101100100111101010111101001111100000100010110111000110101010000101101110100000000010111010010010011000010000111011000010110100101110100100000111111100101111100111011001100010101100101011101111101011000111110100011001110111111101011110011100111110110010 1110101110110001110111100101110111100111000101000101110100100101100011100011101010101011100100100101011010100110100110110001110110000110011101110001010110000101111100111100110100111101010010111011010010011111010100010011101000011011110001010010010101110010011001110011011011011101101010001110101011001101000111010010100100011010100000000110011100000101101011110111010001010001110000111100001111100011 1010000111111111110100011010010101011100011100010000010100100111011101110110110110110000011111000001110001000101111011011001111110100000001100011101010111000011100001110000010000110101101100011011101111100011101110000001000000001011011100011010101001101000111010010111101110101000000010111000110000010000101101101110100100011001100011110001101000101101100000111010111001010100100100011111000110110101 0001010010101100011101110000101010011001001100000000000110101100011001111111110110010100100011011000101101000001100010001110000100011101001011001010111101011000101110111110111101110110010101100011100001100100001110101011011011001101010111110100010111010000100110001011111001010101110000011010100010000001110001000010110000011100001110111010011111010111000001010111111000100110110010110001000111101000 1110100001001111001100101011011010010111100001001000000000011100101000010001100011011110000011101011110111011111100100111010100001101010000111011010100001000010001101011001110001000111110111011110110111010111101111110011000111101011111000011000111101110000111101110011000101110110111111010010101110100111010000100100010000110011100101011011011111001011000111100011110100011100001010010010101011110010 0110001001001111101001110001010010010011001010100010110000100001001010100010011000001001001010010010100010010011011001011111100000001000100100000000001010100010100111100101110101010010001000101100001001001110010001100010001110011001001111111011010100100110010011111101101010001000100100101011101011010010110000011111101110111101101011111010111111010111111000101001011010001110111001000011011101001001 0111111010010010110101101111110111000001010011000101011110001111001010010101010111100110001001101100110000111111001111100101010110100000010011110011010111111100101111001011100100100101000000001110000010000100010000111110000000101011000110001111110101000111101000110101110010011000111010110101010001010011101011101010000011000000100110111000100111001101110110000111111100110010101000100010111111101010
cTrader Algo

はじめてのインジケーター

11/8/2020 6/5/2022

5年以上前の記事です。内容が古くなっている可能性があります。

インジケーターも作ってみよう

cBotに続いてインジケーターも一つ作ってみたいと思います。はじめてのcBotは終わってる前提で進めます。

エンベロープ

エンベロープ(Envelope)というインジケーターをご存じでしょうか。移動平均線とその上下一定距離に平行に線を引いただけの単純なインジケーターです。説明が下手で申し訳ない。見た目としてはバンド幅が一定なボリンジャーバンドみたいなこんなやつです。知らなければ検索してください。

比較的メジャーなインジケーターだと思うのですが、cTraderには標準搭載されてません。なので自分で作ってみましょう。(フリーでダウンロードはできるみたいですが、それはまぁ置いといて。)

パラメータはシンプルに2つだけ。「移動平均線の期間」と「移動平均線から上下ラインの距離」にしときましょう。距離は%(価格の何%か)で指定します。

 

早速作り始めよう

今回はサクサクいきますよ。

cBotのとき同様にAoutomate画面のIndicatorsタブでNewを押してください。ちゃんとIndicatorsタブが選ばれてますか。cTraderのタブはどっちが選ばれてるかわかりにくいのでご注意ください。

新しいインジケーター作ったら名前を変えます。今回はちゃんと「Envelopes」と名付けましょうか。そして右クリックからVisualStudioで開いてください。

 

自動でできたソースコード


using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Envelopes : Indicator
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        [Output("Main")]
        public IndicatorDataSeries Result { get; set; }


        protected override void Initialize()
        {
            // Initialize and create nested indicators
        }

        public override void Calculate(int index)
        {
            // Calculate value at specified index
            // Result[index] = ...
        }
    }
}

 

cBotのときと似てますね。

 

(2022/6/5 追記)

インジケーターの動作の仕方

実際に作り始める前にcTraderのインジケーターが動くとき上記コードのどこがどのように実行されるのか説明しておきます。

[Parameter(…)]はcBot同様、ユーザーが設定するパラメータを定義してます。

[Output(…)]はインジケーターとして表示する値の変数を定義してます。プログラム内で計算した値をこのResultに入れてあげればあとは勝手に画面上に表示してくれるということです。

最初にチャート上にインジケーターが設置されるとまずはInitialize()が呼び出されます。インジケーターの初期化処理ですね。

(ちなみにインジケーターは時間足が切り替わるたびに初期化されます。パラメータ以外の各変数の値も初期化されてしまうので注意してください。)

初期化が終わると次はCalculate(index)がローソク足の本数分だけ呼び出されます。引数のindexは0から順番に振られたローソク足の通し番号だと思ってください。

コードで説明するならこんな処理がされてる感じです。

for(int i=0; i<ローソク本数-1; i++){
    Calculate(i);
}

ここまでの動作が終わったら、その後は毎Tick、Calculate()が呼ばれるようになります。

ポイントとしてはCalculate内では渡されたindex番号時点での値だけ計算すればいいという部分です。MT4とは異なりますので注意してください。

例えば高値と安値の平均を算出して、上記OutputのResultに入れる場合はこうなります。

Calculate(int index){
    Result[index] = (Bars.HighPrices[index] + Bars.LowPrices[index])/2;
}

あくまで計算したいのは「その時点」での値なので[index]で値を参照、代入します。もちろん一つ前の値を使いたいなら[index-1]とすれば参照可能です。

この動作が理解できてればやることもわかりやすいと思います。では早速作っていきましょう。

 

パラメータ設定

パラメータはcBotのときと同じように準備します。

// 移動平均線の期間
[Parameter(DefaultValue = 25)]
public int Period { get; set; }

// 移動平均線と上下ラインの距離(価格%)
[Parameter(DefaultValue = 1)]
public double Distance { get; set; }

 

表示用データの準備

表示するデータの入れ物を設定します。

[Output("Main")]
public IndicatorDataSeries Result { get; set; }

この部分を変更します。

画面の表示するデータは[Output]属性をつけてIndicatorDataSeriesという型で用意する必要があります。”Main”は画面表示名、Resultの部分は変数名なので好きに変えてください。

// 移動平均部分
[Output("MA")]
public IndicatorDataSeries Ma { get; set; }

// 上の線
[Output("upper")]
public IndicatorDataSeries Upper { get; set; }

// 下の線
[Output("lower")]
public IndicatorDataSeries Lower { get; set; }

移動平均線と上下であわせて3本の線が必要ですのでデータの入れ物も3つ用意します。[Output]属性の付いたIndicatorDataSeriesは中身のオブジェクトも勝手に用意されるため、初期化は必要ありません

 

必要なデータ準備と計算処理

次に移動平均線のメンバを用意しInitialize()で初期化します。cBotのときと同じですね。

//移動平均
private SimpleMovingAverage _ma;

protected override void Initialize()
{
    _ma = Indicators.SimpleMovingAverage(Bars.ClosePrices, Period);
}

あとはCalculate()に計算処理を書くだけです。

public override void Calculate(int index)
{
    double maVal = _ma.Result[index];
    double distance = maVal * Distance / 100;
    Ma[index] = maVal;
    Upper[index] = maVal + distance;
    Lower[index] = maVal - distance;
}

ここはindex番目の値を計算する処理を書きます。MQLのように自分でループを回す必要はありません。

引数としてindexを受け取るため、さっき用意した3つの入れ物のindex番目に計算した値を入れるだけです。

 

一応計算内容も説明しておきます。Maには移動平均線の値そのまんま、UpperとLowerには移動平均値からDistance%離れた値を入れてます。

MAから(パラメータの)Distance%離れたところに線を引きたいため、現在のMA値(myVal)を元にどのくらい上下に距離を取るか計算してdistance変数に入れてます。

で,上の線の値(Upper[index])には現在のMA値(myVal)+distanceをセット、下の線の値(Lower[index])にはmyVal-distanceをセットしているというだけです。

 

表示してみる

さて、ではこれで表示させてみます。cBot同様、cTraderのAutomate画面、+ボタンでインスタンスを作成して選択してください。Indicatorはいきなり表示されます。

意図したとおりに・・・なってないですよね。実はインジケーターはデフォルトで別窓に表示される設定になってます。これはテンプレートの10行目

[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]

ここのIsOverlayで設定可能です。ではここをtrueに変更してビルドしなおして再度見てみましょう。

できました。

コード全体

using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Envelopes : Indicator
    {
        // 移動平均線の期間
        [Parameter(DefaultValue = 25)]
        public int Period { get; set; }

        // 移動平均線と上下ラインの距離(価格%)
        [Parameter(DefaultValue = 1)]
        public double Distance { get; set; }

        // 移動平均部分
        [Output("MA")]
        public IndicatorDataSeries Ma { get; set; }

        // 上の線
        [Output("upper")]
        public IndicatorDataSeries Upper { get; set; }

        // 下の線
        [Output("lower")]
        public IndicatorDataSeries Lower { get; set; }

        //移動平均
        private SimpleMovingAverage _ma;

        protected override void Initialize()
        {
            _ma = Indicators.SimpleMovingAverage(Bars.ClosePrices, Period);
        }

        public override void Calculate(int index)
        {
            double maVal = _ma.Result[index];
            double distance = maVal * Distance / 100;
            Ma[index] = maVal;
            Upper[index] = maVal + distance;
            Lower[index] = maVal - distance;
        }
    }
}

 

あとはそのまま使うも改良してみるも自由

自分で作ったときの最大のメリットは自由に中身を作り変えられることです。

単純移動平均線じゃなくてEMAを使ってみたりだとか、同時に2本も3本もエンベロープを表示させたりだとか、自由自在です。

自分で作ってみることの楽しさとメリットが伝わっていれば幸いです。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori