1111100101110111000110011011010110011111111011110010100010101000001001011111111100010010001011011000101100101010010101001100110101011000001000111100001111111000011000000010101110100111101100010000111111100000011101001010100000001100010111011010000111101111010101110011110111101110000111000011110110010101101110110100111100101111010011011011011011000110110000100011111001010011101000100011100111111101 1001001101100000100101001100110101111100101000100100000101000000110011011011100101110000000110010111001111001010101010100100011110110111010001001010101010100110110110000110010100101111000111100011001011111010001001000010011101101100100001011010001001001011100001101000001001100111100101000100101001101100010101001011001001101100010100010110110011000000110100110111000000001110011001001101000111011100 1010001011000111010110101101110001101001100100010101111000000000101000111100011000111111011111110110100111100001010101001011001101000010011101001010001101110010011011111010101111100001100111001010111011101101000010111010111001000110000101010011111000011011101010101100101100100100011000101000110100110011110111100110011100000010111111111011000001111100001111000100000111111111001101101100110110011000 1111110000010100000011100100011111010111111100010001101100111100010111100100001001000111101010111111101110011001000110110101001001100100011101000110010010001111100100001011000110000101110110101110001010001100010100111000100100000101110011011000101101110110111010000110100001000111110010111101110110001001111010010011010001010110010000011111000001010000000011111000010011001101111110111101101011011111 0111011110011000010111010101111100011011011100100011010111001110001000100011011101000001011110110001001101101000100011001011010111100101111011001100010001110001010100101110101100010100001001100101101000011100100101001011000000000111111011110101110010101110101010011110010000100101110100101111001010101011001100100110110010100000110011111001101101111101110001110100111000000100010011111011101101001010 1101010001110110101111010001111111111101000001111101010000110011000001110000000001001001010110011100000000000010101111001100101000001010010010100001101001100000010110010011010010001111001010100110111110000011110010101111110111000000100010010001111101000010001101100000110110001110100110010000101101000101100101110000010000011101111110101001111001111101010101111001001101110001000010001100001101110001 1110111110000011001111111011011000011111100101111001001000101101011101000000010111001010011000101010001001111101101010111000100111010110010100101010101001111010101011100100000010100100010100011011000101010010110011000101010100110101111101001011110111010101100001111011110111111000010000001010111010000000001001000100110111101111110101001101110100100100010010011011001010110101110010100110001000000101 1100110110111000111101011000111110111010111101100011001101101001001001001110111110110010001000101100100100101001001110011010110001001010001110111001100000011010110101010100100010000111101011000101111110101110011010000010111010110000100111100110001001110101001001101010101100011001100101010010001001001110011101110000010101111001110100111100000001010001111101010010100100101110101010101010010001110001 1110000101110010100111001000111111110100100101111101111100001101010000101111001001111010110011111011011110111001111101000011110011000111101010110101100010000111010111111101010000101001011100010011011001101100000100111100100101001100000010010001111010011110011010010111100111000010101100110110010110001100101000000101101001100001100011101100001101000110001011010001011101110111110001000111000100010010 1010110001000101001000010010111110101111100110010100010011000100101101100011011010111110001100100100101111000100000111001011100110101101011000110001100111110101100001001101001011001111011001000110110011101011001010101011011110011110001101101001110010100101011001000011011100111000000100011010011011000100101001010111001100110000010110000000010100011100011010101100100001100001001011000101111111011011 0000101001011000010111010111011100010010101000100010000100101100001010100010000000101101100111111010011110000000001110111101101011100010101011111011011010111010011000011101011101111110000101111011101100111011010000100101011011110100010111010110111001010011001001010011001010001101101010000101001100101000011110101011110111100010010011111011100100001111101100010000010011010011100001110000011011010111 0111101010011101111101010110111101000010001100010110000011110011110100001101000100011011101110111011000011011000000111101010011000010000110010110101111100010000111101111101101001011010011110100110100011100101101001000001111001001110000000100110100110111001100101010111101111010111110010001011000010001001000011010001111001110110011010111100110000110000010111011010010000110111101000100100011101010111 1110111101100111100010101011110001010000011101001001110111001110111011110001010101100011001011010100111001100111000100111101100111111110111111101101100001101110111000011000001100010011100001100100110100101000101110000011001101111010000011000101100011011000010111011101100100111001110011111010011011100111110110001011000101111110011000110101101101111110001100000000110000011111101011111001011010000011 1001011101111000011000111100101001111100001001100000100101111011111010101001001010000101100100011011010100010011010011110001010010010001101100001010101110010010110000111011011000001111000001100010110001010110111000100000001110000011110111001111011010101011110100011110010100001001001011011111101110111101010110111001100011100011101010111000001110111000110111001100100011100100000110000011000000000010 0010100110001001111100100000101001011100000110010001000000100110111001110011010011100001000111110101100111011110000011100010000010110001110001111000111110011111100101100000001100010100100001100011011101100101000000111111000010111100001000010101010010011011110011111100010101010001110011100011011010100010010011010001110000000010001000001010010111000111100000001101101110110011110111111000110000010001 1010101001110010000111110010110010010001101011000010001111011000101000110011100101000001101111101101110100011110110100110111001110000000100011000001001111111000111000010001011110001010111111001101101010001101010001111111100010011101011100101001011011100011110010111011111010110110111001111001011111101011100010110001100000010110011100000101010010101011101010001111101001111110100110101000001101000100 1001100110111010111101011011011111000000001011000110111110110100011111110001101100001011001100111110110001010001100000010010111101010000100001000111001000010011001010101111111101100111101010111011111011111001100111001010001100100110100011110001110110001000011010111000000010100111000110110101000100100001101011110011111001110110111010100100110010010111000000100000000100000010001100001100001000100101 0000001000110000111100000111110110011011001001101010110010000110110011010101011110011010101100001010110011101110110011011010011010101111011010111001100110111000111011110000101110110100000000101011100101111111011100110111111000011001110110010010010100011010111100011001110110000010011001011000100101011000101111000010101111011000111000010111110111000110010010111001010100111000010111100011001001110011 1010011000100010111011110010010011111010000001011101000111100101010011111011111111100010101010110111001101101110111101100011000101000110001110001101101010001110011101001110101001110011101010111010000011001110010110001001101110100001111010010110100100111000100011010001111000101100101100111000110111100100111011000000110111001111101101110000001100101110000111100001010110011000010101101011100101011110 1100101100101000111011001101000000011110010011010100010111001010010100110100101101001110110001111100111101111001101100001010011011110010011111101101010011010001100111011101010000110111000010101100010001100001010101100001100111010101000100010000110001010001101010011000001010011110101000001110110000000011000001101001011110000010010110100111111110100100010000111001011110011011000111111011001011101110 1111110100110000100111100101101010111010011000000000001010011110100001110101111010011110010111101011000001011100000000110001011010100101100111011010111111111101010101000101000011100110111011100011110101100001100100110000110111001010001110111100111011101000111010100010100101100011010000111011101001111110000010000100101101001100100110010010111011100101000000101010001101010000110111011100001101010101 1101100111010101110001011110101100111001010000000111001001001010111010010100100110101111001001110011110100111100101111111100100110111000100101001000000010010110010111110001011110101010000111100110111110011001011000100100011001111100100110011000101011001100000001101100011101110000101111001110001010100001101011111111001111010001100010100100110101010100110000000000101000001001111111010111001010111000 0011101100110101100001010001001110101011010000000111001011001010011101111101100100100010010111101001010110111010011100101011000011110000011000101010110000011111011100000010111100101011111010000101010001010001101001111001001100011000011000000111010100001010111101100111010001100111101100111000010110000010010001000101001100100101001111001010101111101010101110001110110010111010000101000000010011100110 0111001011110010011110010101100010001100010000110010110101110111001100100111001011010010101011110001010111101111111100111110001111110100100011111000111111010010001100000010110110001000001001000000101011001001001001100010010110100011010100010110000010011111000101001001011111010100011011000101010101010111001101001011100011010101010100101010000000110011100101000100011001001100001011010110001011001001 1001111011010011111011101100100001111001010111111111111001010000000000111010010110110100111111110011100011011001101100011010111100100100100001111010101001100000001010010000010101010010111111101101110100111111100000100010101100001111100011101001011100100110100101000100111011001010100111110101101100001011000001100011111010000001100000001100011001001001110110111111001100110010010011110001111101111001 1001001001110111111011101011110011000111011000100110100001111010100100001110100000001001001111110010010001101001101000011000010100001010011011101101111111000001110101101101000000010010010010100011010100001010000000000111000011101000011010010100111100011001101100010001001011011110110101110001010100010111010011011001010101001001110001101010000011001010011010011011000100111000101010100110110001101011 1010010000010111010100000000110010110101101000000101010011110010000100101100011111010001010011001011011010001001100001011000111001111010000001001110100100000000011101001011101101010010001000000010100010110101010101011000101100101101001010010000100010111001110011111001111111011100000001111011001011101001101011110101110011000010101001001010110111010110110110011100100110011111011000100000001111100100 0011111110011001001101011111000000100101111110010101000100111100001011001000000101011111011101011110000111011110010011011110001001101011101110011000011100100000010001010001110000111001100101101001000000001111100011100000101011011010010011101100100111000101101100101110011110000101001011111100100011111100000111010001111001000000010000111011001011001011111001100000111100100011110011111000111001011111 1100011110111110110010000001100101011111010111011001010011101001110110010100000011000100111010001101011000100001101010001010110110000110111100001101011110111100101111000100100011100001100110001010100011011011011011011101110111101100101001101110010111011010100001110101000111101110000011101110000001100111000011011011101101001010000000000110101111100111010111110111011110100100100000100101100110110000 1001011101101011111001100010001110011001100101000011100000011011111001111011101110010010101011010101100111100011000001101100111011101110011000011000000101100011010001011000111001111011110101100011110110000100011010000010001001000011010101100110010100100000110001000000101111000011110110000010111100101011001011110100111001101010101111100100101011110001000111100101100001111010011111001111100010110110 0110011010010101110101001000000011000100001110000110000111010010001101111000001010010001111000111101101001001110101110010011010110101001110101100010000100000101001101100100000101011111000001101110100100110100001100000101010000000110111001010111111001001000111110100100100000110010000011101110011011100100010110100101100000110101101100000010000010011101011010110000111111100001100101111100111010000000 0110101110111010110100110101001110000000110101100000110110110001111011000000001111011101001111011011001010000101111000110110100110000001100110101001010100010001010100100001011101010111010001001010001110100111101011111111110010010101101000011010100000100001000111110100111000010101011000001100101010101101100001111011111000110111011111001010100000110011000110110011010010110110001111101101110000010001 1111110100111000001010101110011111111010101010001011010110110100100001110110011011010001101000010111001011101011110011011011010011010110010110110010011001111100001000011111010110110111010101010011010010001100100001011111011101011100010000101100011000100100001010001101001010111101110111100100001111110100101101110100100010000110100001010010010011000010001110011111000001100100001000110111011011010000 0010001000010001011111000010000100011000000100000110010010110111001100110100110110011111101001000110000111100010001110000101011100010100101001001101111100001001011011000111001010111101000111110010011100011011000110011001010011001111110111000010110011010010111110001011111000011110100011101110001101001000110100110100001001110100000011111011100000110001101110101000101010110111100001011010111001100111 1101110001111111101010110011110011100011110110010100001110111110101110100001000000000101001011110110010111100000101011001100000000001011110000100111001100001110000111101000011010110111101011101001100100000000001110111111101111010001111010111100011111001001111111001011100110000001110111100000010010011010111111110011100000001010101100101111010000101100011111111000100110101001100110000101000000011110 0011111101101010100001111111110100110000101000110010101110001101101010011111110100010001010000110110000111110110001100000110000011010101010101100010000111110000010011000000011111110111011111111011101011111110110010001001110111001001010110001000011111111111100111101111111100100111000100100000111101100111110101001000101110101010111000110110011101110111001011110011111110101101010110111010111001010010 0011001100010101010010000010111100100111001100010010000011010011010111010101001000110100001111111001100110000110011111001101100010001010001100011110010011011100110101000000111001010000111000011111001101100011000000100001100111001000011111101010011110010001011001001010110110011100110000111101101111001010011010011111110001010100101001110100010100111001111001011010100101010010111100010111111111001100 0101010110011001000110000101000001100101101011001111100011001010101011100010011000000011010110000001100011111010110101010101010000101010000111001100110110001000111110101011000100101000101111100010001011001101100011101110100110110010110100111110101011000101100000111100011100010000100000000110100000101110000001010001110110111111101011101110100110110010010101000001100000010011000101000010010011001011 1100011000000010111100100110001100001101100001100100100110000001111000100111101011101101000110010110110101010110011000000000000101111001110111001010011101001000000001010100100100011111110001111111000011100111001000011011110100100100011001100001000101111110110010010010100111011111001101101010000100100111101110111111111111100001010101010111001000011000010010101110011001100001100100000011111000001101 1111110111001001010101000111000010101110000001100011110110010101101000111110010111110111100010010011111001000110010011000110100000010000001100000010110000011100010110111110101000100100101001101010011011001110001100010000001100101101010011011011101001100100010101010001000011110001011000000000001110001110110101111110111011100011100010111100100010000111001011111000010010000100001010011001001010011100 0000110001011100100100011101010111101100100010010000110010111110111110110111000101101010111111011111111001011001010111110000110011101110101010110011101000001011010000010111110010110010011010010000001110100001010111101110010100000100100000100100110100001010011100111111001011100110010010000000110101011001011001011101000110011100101110010111011100101101010000110110101010100010101010011110001111110101 1110110111101001100101110011011001111111010011010101001010111000001011001000000100110000111010110101100100101000001000110101000101111111100011010100100001110111001110010111101101010110010011001101010101011101001010111010000000011001110010100110110101100011110010000110000101011000001100010110100101111110100000000100100100110111111111110110100111110001101011110100110010000101111011101010001101111001 1101101010001100010110011110110100011101111010101111110011101010000111100111110111001000010111000100100111110001000010010011001010101100011101111001101011111000111011000111110111011111010101010011000111001001101000110000101010000010100000101001000011000110010001111100010010000101101011001101100110011110000010110001110100001001010100011100011011110101101111010001110100001101011111111110001001101001 0011100110010100010101000010001111001000101001010101000010000100101111101101000001001100011010011010000001000100100000111101000011001101000101101000000000011001001011001000110110001000101011001110001010001001000110110110000010011110000111101111011100111100000110011110101111101001110110000001000110000011100001110101110100101000100110010000110010110101101010011111000101000100011101101000011100111011 1101110101001111110000010001101000000011100001010100010101111011100111011001111101111001001010111000111100001010001010101011001011101011001011111011101010000001111000100011001001010001000010100000110100000100011101000010111101100010110010001010001101101101001100001010011010101100100011111110001100011100000001111011100101110100010000111001010000001011111011111011111000111101010100101010110010000111 1101011100011011011011001010110110100010111011101010001010110010110010101011011111111111101001010011010101011010100011100000111101000110101000011100111000100100000111010101101001101000001000000000110111111110011110001101100100010001100111001111101101110110101100110011011001101111001001110110111101011001110101010010000010010010110011101111110011111111101101111101010100011000010111001001111010010100 1000110101100010101111100011111010100110110001101000100101110111110111101000100111011010110111010000011011010001000101101101110111000100000101011110011111011000101010110011000110000101000001010111101001110011110111110010100101111011011010001100110101010101010100010101000101110011110000000010100100010000000000000110100010111111111001100110111010110001001100110100110000110010110101111001111100011000 0100010011001011000011110001001011110110110000000101001101110100100100000000110110011010111000011101000100111110110010111110101011100100100010000110111011011100101111001101011110111001101011010111100011001100010100110000101100001111110110110110001000000111000000001100001101000101101111110000100011010100010011010110111100010101010000101000110110001101011001010101110011010110111111111100101111000011 1011100100100010101010001001101011010111011010101011100100000010000001000111000011000001000100111000011000101100001000001100011101100001010110110110001011111000100100011001000101010101000110010011100101100000111010100110100000111110001001100101010010111000110111000100011100101111001100110011001101011001111001011110111001101010100001001110000010010111111011110011010011000011110111111101101110110000 1100100010010101011010010111101010111001010101101100001111010011110110010000011010011000011001111101111110001111100110011010010100000000110100110011110111100011101111110010001000010000000101001101000110010000101001110000100111111111000011010111100011101100000110011001101010001001000001111101010110111111011101111101110111000010000001010110111110001010010111100101010101000011111001010100110110111000 0100101111110111110011000010000010000010110010111111111111011001100011111001101110011100100010011010111110110001000100011111110010011011000011100011110000000100010010000111001111011100111010101001110000110100110010000111100001000110100100101100101011110010111010111101011110111000111011111001010101001000010011010000101110111011100001000001111010000011000111011010100101010101111101001010100111000110 1010110110110110110101001000101011010011011011100000011010111011001110001001110001011011100001011011100001100010000100001011101110110011100100101110010010111010100010100101101111100011111101101111101000000110101110000100100011111110010110110011000100001111110101010001101000001100010111010001110110100100000111100001110011011110000110111111111001001001100100101011011001110001111111110011111001000101 0001001001001000110000010000100101110001001000000100011101001000100011101001001000011001000010011011100111111111000101011010011001000000010100111111011010001001101100010110011011000001111111110001101100111111100000011111100001101111100100100010010100111100100011001101110010000111000000110111000001111100000100110110001111000111100100111001001011101110101001011100011010011101100100111100000100101111 0111011101110111100001100011100011010111011011100100010001010111110011001110000000100011111110011000111100011000110010110011110111010100101111010001010111000000001001110110100000010001001000001010010111101110000010010101101001010100101001101011110101101110010100110110111101110101000011110010011001110100111110111111001001010110111101110000010000101101100001111101011111100001101100101100111111011101 1001111011100110000001001100001010001101101111110000011011001000101111001000100101001011001011101101100111010001001001110111011101101000111000111111101100111101100011111011000101110000001110101101101101011011001110100111010011011001000001111101001010001001000010111100011110100010110000001000110111011001110101001010111000100110001001101010001011100000110010010010110001011001111000010001000111011001 1110001110101111011000010110110111011101011001100100011111110001111111001100011011111010100110000001010100011011000001111111101001010001000101101011111010100100001011101101101110101010011000101100010111001000101010101100111110011001000111100100001000111111001100101001100110000101111110010101011101011110010011101001101100011100001000000100111001001010110111000111010010111111110111101010010011110000 1000001001110011100010111111000101101010110000000101010110010011010001010100101011011010110011011000000011000010010011101010101110010010100000101001001000011000110101100111110000010011101010110101110101100111001011100010100001110111000100000111111011011100000011010101011001001000000110010010010011100111110110011000101100011000010100111101100101010010110111011110110010110110101100111101101100011011 0111011011000111100010111000111001110011000010011000110001000000011110010110011100100001110011110001010001001010000100110110011001111111100100001110011101110101001001010111101101000111010001100001100110001000000011111001011000010000110000101100001101001110001011010011011111011011100010100110010100011100010001100101100000111011001011011010000000000001011011100011000101010100000011101010111100110100 0110101101010111001110000011100010110001001000001000001000111110000010111001000011010101110000011110100100111111110000100110110000010111011101101100011100001111100001101101000010110011011000100000101010100100011011101101111110011000110011010111000111110010010100110011101001101000111010110101001010111001101100100000110001101100110001011100101001000001010100011001000010011000001100101011110110100101 1101011001110111101111110110100111101111110011000101101111111000110011111000010110100011111110001110101001110001010001011111011110011000111111101001010101111010100010000110011010011100100101101101111101000011000100100110010111010001000011000111000000011001110101111110010010011000001111100101101011001100100101001001111100110010000010110101110001000110010010000000001000010100111101010111111011001001 1101010100011011111100110101101001001011101111001101001000010010101100110111010110000101000000011011011100000111011110101011001000000010101010100110111100010001000011110110010001100100101000101010000100111101000010111110111101001011101100001110000101010010100111110111011111111100111011101101110010000011010010101101111000111010101001001100110100110001101100101011001001101001110110000001001010111011 1011100110100101101110100100000000000011101000010001000101011110011101110011001000111000010000101000110110001110101011100111100101101101001111000010010010110100011111101011111000111011000001000100101010000111110001101000101011010110000000010110001111111101010000110011010110111111001011001010001000001100111111010111111000110111010111000110011010010101011011111100100011100100110000010100000110001111 1100101011000010111011111001100100100000101110101100100010101110100011110000110011111011111101010100000010100010110011101001000011100000101001111100100000011000000011000011101110100001011111100001011010111010101011110101001111110101111100101001000000011101111101011011111001010101001100111000011011011000000000101000000101101010010011000001001001011010000010111001101001111011011110011010110111100110 1010011101011111000100000000101000100101101100000010000101011001001110001000011110110000010101100011111010100000101100110100100011000110010000011001011101110001011111011111100110100001100110011010100010000000010001011101111101010101001010000001000111100000011000001111100111100111010110011110010111110100000001001011110001100001011001110111110110100001110011101100100111101000110001100100111001101010 0001100000100100000101000110100000100111010100011110001000001000110000001011100110000111111000101100101011101110000011101000110110101100010000010101110110100010110110001110000001110100101111111110111000101001101100110110111101001100011010000000100000010001100110100111000111010111011010000100110000101000010000111111001110111101110010011010110000111100100111101001000111000010001000101111011010010101 1101010010000000111100010110010010100100101010100011010100100011001010111111100001000010011111101101011000001100111011111001000111101010111110010000111010001111011011000100111001001000000111101101111010100011111100111000011110101000110101100000101110111001011000011010010100000111111010110101110111100111100100111011000100000010101010001010001110110011001011110110111111011110111101010111001000111010 1101111001100000000101110001100001010011100010010011001100110011110010110000110101110011101110111110100100011101001110001001001101001011000100110011111101010100100001110111100010100100011011010100100011100011101111101101111011001110100110010000001010001000111011111110001111101100101001001101011001111101111101001101111011110001111111011000100010011111110111011010101101100000110011100101100010000001 0001110101010110110101101101011110010110101010110111000101110101010011110011111101111111001100101100011011010001010001100110101010111000011001110100101110010000010000111010001010011101111101010110000100111100010001000101100111111110000000101001101000111001111000100001010100100011110100110011001010000110100000001011001000100110000111100011010100010110001001101101110011110111011000111011010100000000 1010010101010100011100100111011111101011001000111011101000110100110011101111000101110111011101010110010001010111100110100010001100001011011010101111101110000110011110000001001110000100001111100100111111001000001101010110101011111011100100101001001010000000101110010010001111010100011000101011011100100000000010111010101100101000000001101000110000100101111111101111111000011010010010110000000011111000 1000110011111101010110100001101100110001011101111000110110010101010110110101111111010110010100000011000100001101100101001001000010010111000110111010011010100010110100111101001111001111000111111110011001001111011010111000111000000111110011110001001100111010000000001100001100111001110010110000000010001011100001011001000100011100011111011010101101000010101111000100001001001001101011110011111111111011 1001101100010010110011011110110011010011101100000001101110001111100001100010100011010000101010110111110110010010010110111111100011010011100001010111001101110101101101001001101101100100101110110001111100011011101000111110010111010110010000011101001011010100110100010001110110110001111101101111100011111101110000111100101101010101100010001000001101001111001100001000111000111111010100101101111001000110 0011110001011000111101001001000011010110110110010010011101010110100101000110010111111111111001111011000010011000010001011010111010101110000110001001101101110110001000010111110000000101000111001100011001001100101010011000011110000111110100001101110111001010111000100010000011100110010000101001100000011011100100000001111111111101101010000100110000000001100110101000110010100100100001110101100011100001 1110100100001111001100100110101001011110111101110101111010111011110001001111011010000011000110011000100001001111001110000001000001000110010010011110101110100110011010010111111101001011000011001010111011011110111100101111011110000111111001000000111010110101000011100100010110001001110110100101011000001101101111001111000011110111011001101000110000111001000000000111100001001010110110001011100100001000 0100010111110111001001111010000100110111001010100001000010100110100011110110011110010101110000110010011000010011000011011011110101000010110111000010000110001110101001000101000100101110000000101101001010100011011010001010101011111101110110001000011100111101011111111110011010001010101011011010011011000111101100001001001000011010111100001001101010011001011110000110011100011000001101110000111101000001 1010010111001110001101010110000100111111110110101111110011011100010001100101101101101000010000101001101110001001101011111000110110011100001110100100001101111011110000000000000100000110010111011001110001010010000000101001100001011101111111111000100100001100111001001000000000111110001000001100110110101011000101011001001011010100001110001001001010000010111000011000011100010110110110110000110011001011 1101110110100110010000111001000011010111011110100001001101110010110111110000100100111001000110010011010100110001111101000010001110111101110000110010000101100011111101001011001011111000110110100111000101000000100011011100000010110000011111010101000100000001111010011000001011011110100011110110110000110101110010000011001010111000011110100101101100011101010010010110111110110111001111110001100111100001 0010000011101101000100000000101000000010000011100111101010111100110111001100011000000011111001101111101001001010100011010001000000110111100101011011100111111111111000100110010100111010110100110101100100101101000100110010010110000010110100100101010000101101001000011110101111000100100111000101111000110011111010010011010111101001011111100111110000000010100001010110000100101100101110010110011100100101 1100010110011101010011101011111111001010010011101001100011010001010001101011000100100111101111011000110001100000111100110011101000001111010100000010010100100010001011110000110000100011010101111110001110101100100111001000100011110011100011000101100101101101000111011010100110010101100100000100100010110000000101000011011111011111001010101001100101111010011100111001101011101010101110000011100110011110 0100110011110101100110100111110100100110111011001010100010110111111000110110110111101111101001011001101010011011010100101001011101000100001101011100111011101111001100001001001011011010001001100111100010100110001011101010010101001011101010010010100000011110000010011011110001001101000001111111011101000011011010110011011111100100001000111010001110011001110101000100011111101100100010110000100100010010 1010101001110111110101010011011000110110101100101010101110010110111101111111111000010011001000010010101010011111100111110100111011101101101111011000100001001111011001011101001100000011101011100001110000000000111100001001111001100000011111011000011001101100101111011111011100100011011100111101101010111011100110110001111101001001111110001101000001100110001100000011101000100111000111001101010010001001 1000111011000011001110110011100010011110111001110011101111111111011111111111110010100111011011100111111110011001100111101010111101100001110111110010110000101110110001011100010110100110000100001001000000001101111010001011001011001101011001101011100010111011101011111010110110100110010011001010101001101100010000001010010111001011101011011111101001001000001100111001010100110011011011001110101110111111 1001110101101101111001001000110100000001100100001011010010111000001000000000011010110101011000000000000110111011010001000111011010010100011111001100111110100001111100000001100111100011110100000111101101100111001000000011111010011101000101000101011100000000000100111100010010111000010011001101011101011000000011010110111010011000001010110111010000000100100001111011110001111000111000110101100100001011 1001000111100011011111000011011101011100101111001100011110000111011011101011001010101011010101110100100010101101000001011000101101010010111111110011001001100101011110001111101100100001110001101010001010110000000010001000111110011110010011111110010000100011100011001111111100101010011001010000001000101110110010101100001111110010000011001011001000111010110000010000111111010111100111110111000001011010 1001101111101101100000011001000011101100100010110100110100101100111010111100010001010111110001110110001000110111111111100110010110000111100100111011110001011011111010101011111001001111011000000010011100111111010001100000010001111001110101111101001111100110100110011110110001010011101111011111010001101110000010110000110001011001010000100110110100000110110100101101100110010001000111101011111011011001 1111101111011101100100111001001001010001111100100011001000011000100100101001001011010001001100001101111101011111101011000001111010001011101101011100100000100010000001111101110101011011111010010000010111001111000110001100000010111101100100011010111111100010001110101011110110010010001000001011010001001110000110000000000111111011000111000101001001111010000110111100001100010000000101010101001111111000 1101101010000011100101110110000001110011001011011000110101010111110010111101110001100010001111101010001100000000000110010010110000101110110001011011111111100001111010111100100000010010011000100111001011010001000010110010111010101010110011100000000111111110101011001011000000101111111101100111001010000110100010000010010000001000001011000100110010100000010011101101000110001101000010100001011101000110 1001110110111101010101111111001111011001110101110001011000011101001100000001101001101100010110100010000000110101101100110001110001110101101100000100010001101010110111111010010111100011011001010011001100010010100110100011001001110100001111010110101010010000110101100001110101110001110110110001101111011101000001101101101011000010100000110010011010001010101000110110010101011000100010010000110000111110 1010101010110110000110111010010010110110001101010111100111001100001011010101100111100000010101000001011001010101001010000001011011100011001111010010010111101011001111100001110101111100000101000000011010010111010010001011010001110101111011101001001110010011110100111000010101001000111000111010110011101011010001110001010010101001110010000011100011110111010100011110011010110010111000010101101100001100 1000111011010010101001111011000100010011101111000101001111011101111100100011011000101110101101011011111101111001001100010011000100011000111000101011010100110110010110100000001111001111011001010000010001100010000100000010000011000110000101110111001111011100111100111001011011000000000100010110101001011101000111000100101011110100010010100111000010001101011000101010000001011001001100001000000100100001 1010010100100000001111101011100000001010110001010100011100110000000001001001011111001001111100100111100000001010001001111001100101010100110101101001111101110011000110100111110001011100101000010010001000010000010100101010110110100111100100101000011111110101111010001001000001111100101111100101100011011110001000000010000111011101010010000111010001100010011011010010011000001110100110110100011110111001 0001011100111011111100001101011010111101110110010111010111111011100000011100110111011100001110101010101111101101111001000101101000001111001010101111001001001011100100010000111101101100001100111111111101000001101001000110010010010111111110011001001111100111101010101110001001010001011101010010000001000001100101110110110111110110100010110000000000100001100011010110111101001101111110101001110001110011 0010110010001100000110001000110101111110000100001100000110111100010011111000000010000011000101011000110100000111010011011001011100000010111111000101011010111111010000000011000011001101111110010100010001100111000001101101011110111111101100001001110001101110001000000001010100110011000001101111100100011110111111010000010101110010101110101000011000001101011001010100001111110100001010000010001101010001 0101011001101000101000101111000000000011001101100001000110101101010110001100010111011001011000100101111001100000000100110011011110000010110011111101010101100000100100010100000010110101101100100011011111101100111000010111111100001010001010001011001101101010001000000001001000101101010111100100000011101111111011100011011010101010000010011101000001110101100100101101010110101111011110101110000011011100 1101111001011010101110010100000111110101110100001001100000011011101000100110100011110100110001010100100000100001100010100000111111110011100111110011101101101010010111010110111000111011010010000100000000000010100000110101100010100100000011011010111000100011001100111110010010000010100000111100111010001000101100011010110001101110110001111001110110110011111111011111111101100000001111111100101001000001 1000010100000010111100001010111101010111010010000101110000110011110001010111010100001000011101011000000100011110000111000001101100011001111000101011101101100111010110000010010001000000001100000100011101000100101000010000100111000111000010001100111000110000101101111111001111101110000111110000111000110111000000110010110100001100001011001000101010110100110101110110111100010011101000100111001001100000 1101110000100001011111001100111001000011110110111001100010111111111001010010011111111100001010111111001101011010000111110101101000110110010101010111010010110000000111101000101111000001110110101110000101111101000000001010101100000001101000011101111001101101101111101111111100101000010000101110001111001011000010000101010001011110110011111001101100001110011111111110001100111010100111110011111011111101 1100100110000101001011110110100000110000101000011111100100001100001000110101001011010101000111010110100010101000000010001111000011101010000010111001101001011100010011110001011010000001001011000001010111000001111001100010111011001111010111101000111100100100000110001011100110001000011000101011010011100101000011000011000000101001010101100010100100011111111101110111010100110000111001101101000010001111 1001001001001000011011111111101111101110000001010010001111100111110111011111111001000010000001000101100111110101001001110011000110001000111011100000011010010010110111001000010010101111000011100101110011011001100011100110100100110111100001101110010001100111100001001000010110001011001001010001110110101001010001001111001100111101011011010000000011111110100011100001001110000001111111000001111100100101 1011011111111010100110111111101010001000110000111001100000110010001000000101001010111101101011111110011111110001010111010001101111011011111011011100100011010110100111011001100011110110000101000001111000101100100101101010001111010010011001100011101011111111001010000011010101011001110011110100110110000000100000011010011110011011100000010111101011111011010110010000100011010011111000011011011111001000 1110111000001101001011001110110000000111100110101011011010011010011100010100110101011001111110000000110001001110011000111010000110011001101111010100001101011010111100100101111000111010100101001000000101100101110110100001110100100101100000000111110101100001100010101010011110101100001011010110010011110101001110100101110100100110001011010110010010110100110101101101101110101001111111000010111100100111
cTrader Algo

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

11/8/2020 6/5/2022

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

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

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